为什么第一个函数call(cm(car);)绑定到第一个函数?
我知道第二个调用绑定到第二个函数,因为它是非模板,尽管两者都是完美的匹配.
如果第一个函数被定义为具有固定数组长度的非模板,则:
void cm(const char (&h)[8]) {cout << "const char (&)[8]" << endl;}
Run Code Online (Sandbox Code Playgroud)
而不是它再次被选中在第二个(第二个调用将是不明确的那种方式).
码:
template<size_t N> void cm(const char (&h)[N])
{std::cout << " const (&)[N] " << endl;}
void cm(const char * h)
{cout << " const char * " << endl;}
int main()
{
char car[] = "errqweq";
const char ccar[] = "errqweq";
cm(car);
cm(ccar);
}
Run Code Online (Sandbox Code Playgroud)
输出:
const (&)[N]
const char *
Run Code Online (Sandbox Code Playgroud) 使用gcc/g ++编译给定的代码示例成功.strchr呼叫没有错误,这显然是指定const char *的char *.
我发现它strchr被声明为char * strchr(const char *, int)两个不同的来源pubs.opengroup.org和cplusplus.com
如果strchr实现为抛弃constness,那为什么会这样呢?
如果目标是提供兼容char *和const char *字符串的功能 - 它可以使用两个不同的函数名实现.
你能否对此作出更全面的解释?
#include <string.h>
int main () {
const char *str = "Sample string";
char * ptr;
//ptr = str; // Error: discards const qualifier - both on gcc and g++
pch = strchr(str,'S'); // Succeeds in assigning <const char *> to <char *> …Run Code Online (Sandbox Code Playgroud)