C++ 这个语义调用哪个构造函数?

C++ 这个语义调用哪个构造函数?,c++,c++11,C++,C++11,这是字符串的构造: string s {"Hello world!"}; string类具有以下构造函数,我认为可能会绑定到该构造函数: 来自字符指针/数组: string (const char* s); string (initializer_list<char> il); 来自初始值设定项列表: string (const char* s); string (initializer_list<char> il); 它们是一样的吗 假设string还有一个构

这是字符串的构造:

string s {"Hello world!"};
string类具有以下构造函数,我认为可能会绑定到该构造函数:

来自字符指针/数组:

string (const char* s);
string (initializer_list<char> il);
来自初始值设定项列表:

string (const char* s);
string (initializer_list<char> il);
它们是一样的吗

假设string还有一个构造函数,比如
string(初始值设定项列表)
,那么它将调用哪一个

string(const char*)

{}
语法不一定意味着
std::initializer\u list

在C++11中,大括号
{}
用于统一初始化。任何可以初始化的对象都可以用大括号初始化。优先考虑采用
初始值设定项列表
的构造函数,因此如果花括号初始化可以匹配多个构造函数,并且其中一个构造函数采用
初始值设定项列表
,则将选择该构造函数。但是,如果没有匹配的
初始值设定项\u list
构造函数,则也会考虑其他构造函数

例如:

vector<int> two_elems{5,10}; // A vector containing two elements
vector<int> five_elems(5,10); // A vector containing five elements
vector<int> five_elems_also{10,10,10,10,10}; // Equivalent to the above
vector<char const*> vec_of_strs{ 5, 0 }; // Creates a vector holding *5* nullptrs
vector<unsigned> vec_of_nums{ 5, 0 }; // Creates a vector holding *2* numbers

上面的两行调用的构造函数非常不同,这一点现在还不明显,如果在维护期间(或者代码发生在模板中)将其中一行的类型更改为另一行,程序员可能会对突然的行为更改感到非常惊讶。

这已经被问了很多问题,但这是第一个构造函数的统一初始化。您可以自己尝试:。要调用使用
初始值设定项\u list
类型的构造函数,您需要使用以下-
std::string s{'a',b',c'}我刚刚意识到它实际上可以通过C++11调用
string(string&&s)
。@texasbruce答案是一样的。它是统一的初始化。如果一个类(假设字符串)也有一个
string(initializer\u list)
的构造函数,它将调用哪个构造函数?@texasbruce它将调用
T(initializer\u list)
。编辑:您不能有右值引用的列表。@jrok,因为我认为我放置了临时的文本(比如可以绑定到右值引用)?您没有传递临时文本,而是传递了字符串文本。是的,在转换为
std::string
时,在某个地方会有一个临时变量,但这与模板参数关系不大。
初始值设定项列表
背后有一些编译器的魔力,特别是它没有指定元素的存储方式和位置。感谢您的回答。。。改变正确答案是不礼貌的,所以我投了赞成票:)10分和15分很接近…@texasbruce一点也不粗鲁。如果你觉得它值得打勾,无论如何,改变它。@jrok,我故意加上“5”。@Adam抱歉,回退。我看到括号是有原因的。@jrok好吧,老实说,大卫的回答更直接,所以我不会改变它。哈哈。但这也是一个很好的答案