为什么指针衰减优先于推导的模板?

假设我正在编写一个函数来打印字符串的长度:


template <size_t N>

void foo(const char (&s)[N]) {

    std::cout << "array, size=" << N-1 << std::endl;

}


foo("hello") // prints array, size=5

现在,我想扩展foo以支持非数组:


void foo(const char* s) {

    std::cout << "raw, size=" << strlen(s) << std::endl;

}

但是事实证明,这破坏了我最初的预期用法:


foo("hello") // now prints raw, size=5

为什么?不需要模板到指针的转换,而模板是完全匹配的吗?有没有办法确保我的数组函数被调用?


ABOUTYOU
浏览 482回答 3
3回答

侃侃无极

*被调用的转换构造函数是用户定义的转换序列的一部分。用户定义的转换序列由用户定义的转换(ctor调用)加上初始标准覆盖序列(数组到指针)加上最终的标准转换序列(此处为Identity)组成。当然不是序列本身。
打开App,查看更多内容
随时随地看视频慕课网APP