`string s("hello");`和`string s ="hello";`之间有区别吗?

Fab*_*ian 2 c++ initialization variable-assignment copy-constructor assignment-operator

标题说明了一切.但是,请string作为任何课程的占位符.

std::string s1("hello");  // construct from arguments
std::string s2 = "hello"; // ???
std::string s3;           // construct with default values
s3 = "hello";             // assign
Run Code Online (Sandbox Code Playgroud)

我想知道声明s2是否与for s1或for 相同s3.

son*_*yao 14

案例s2复制初始化.这是初始化,而不是作为案例的分配s3.

请注意,对于std::string,效果是相同的为s1s2时,apporiate构造(即,std::string::string(const char*))将被调用来构造对象.但是复制初始化和直接初始化之间存在差异(例如s1); 对于复制初始化,不会考虑显式构造函数.假设std::string::string(const char*)已声明explicit,这意味着不允许从const char*to 进行隐式转换std::string; 然后第二种情况不会再次编译.

复制初始化比直接初始化更不容许:显式构造函数不转换构造函数,也不考虑复制初始化.