我可以看到 std::string 只有一个带有initializer_list
:的 CTORstring (initializer_list<char> il);
所以初始化列表应该与字符一起使用,对吧?为什么std::string{"some_str"}
有效,它得到了const char*
,对吧?
问问题
333 次
1 回答
5
n3337 13.3.1.7/1
当非聚合类类型 T 的对象被列表初始化(8.5.4)时,重载决策分两个阶段选择构造函数:
— 最初,候选函数是类 T 的初始化列表构造函数(8.5.4),参数列表由初始化列表作为单个参数组成。
— 如果没有找到可行的初始化列表构造函数,则再次执行重载决议,其中候选函数是类 T 的所有构造函数,参数列表由初始化列表的元素组成。
std::string
有很多构造函数。其中之一,接收const char*
.
因此,首先编译器将initializer_list
在重载解析中采用 c-tor,但它不是可行的候选者,当string
使用 构造时const char*
,编译器会查看其他构造函数并选择最好的一个,即
basic_string( const CharT* s,
const Allocator& alloc = Allocator() );
您可以通过简单的示例对其进行检查:
#include <initializer_list>
#include <iostream>
class String
{
public:
String(const std::initializer_list<char>&) { std::cout << "init-list c-tor called" << std::endl; }
String(const char*) { std::cout << "const char* c-tor called" << std::endl; }
};
int main()
{
String s{"hello"};
}
于 2015-10-23T08:55:01.460 回答