考虑以下:
class Foo {
public:
Foo (const char *in) {
printf ("C string constructor called\n");
}
Foo (std::string const &in) : Foo(in.c_str()) {
printf ("C++ string constructor called\n");
}
};
Foo bar ("I never asked for this");
//C string constructor called
因此,常数string
被视为const char *
一个。
但是,如果我们将std::string
构造函数设为“主要”,会发生什么变化?
我们可以期望std::string
创建一个对象并将其传递给相应的构造函数而不调用与 C 字符串相关的构造函数吗?
class Foo {
public:
Foo (std::string const &in) {
printf ("C++ string constructor called\n");
}
Foo (const char *in) : Foo(std::string (in)) {
printf ("C string constructor called\n");
}
};
Foo bar ("I never asked for this");
//C++ string constructor called
//C string constructor called
同样,首先调用了 C 字符串构造函数。
这种行为是在 C++ 标准中描述的,还是与编译器相关的?
这对于例如模板或重载函数的工作方式是否相同?
我用 GCC 7.3.0 (MSYS2 x64) 编译。