为什么在这种情况下,复制列表初始化和复制初始化的行为有所不同?

时间:2018-11-10 06:29:43

标签: c++ constructor copy-initialization

#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的隐式转换,而复制列表初始化和直接初始化则允许这样做。

1 个答案:

答案 0 :(得分:0)

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

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*