为什么复制列表初始化和复制初始化在这种情况下表现不同


#include <iostream>
#include <string>
class testClass {
public:
// testClass(const char * s)
// {
//     std::cout<<"custom constructor 1 called"<<std::endl;
// }
testClass(std::string s) : str(s)
{
std::cout<<"custom constructor 2 called"<<std::endl;
}
private:
std::string str;
};
int main(int argc, char ** argv)
{
testClass t0{"str"};
testClass t2 = {"string"};
testClass t4 = "string"; // error conversion from 'const char [7]' to non-scalar type 'testClass' requested
return 0;
}

复制初始化似乎不允许从const char *string的隐式转换,而复制列表初始化和直接初始化允许它

编译器正在寻找的构造函数是:

testClass(const char* s) : str(s) 
{
std::cout << "custom constructor 3 called" << std::endl;
}

我认为您的代码失败了,因为它需要两个隐式转换,赋值和const char*const std::string&

此外,您应该使用const std::string&

testClass(const std::string &s) : str(s)
{
std::cout<<"custom constructor 2 called"<<std::endl;
}

因为在testClass t4 = "string";中,您给出的是const char*

相关内容

  • 没有找到相关文章

最新更新