为什么std :: string {" const char ptr"}有效?

时间:2015-10-23 08:52:52

标签: c++ c++11 stdstring initialization-list uniform-initialization

我可以看到std :: string只有一个带有initializer_list的CTOR:string (initializer_list<char> il);所以初始化列表应该与字符一起使用,对吧?为什么std::string{"some_str"}有效,它得到const char*,对吧?

1 个答案:

答案 0 :(得分:5)

n3337 13.3.1.7/1

  

当非聚合类类型T的对象被列表初始化时   (8.5.4),重载决策分两个阶段选择构造函数:

     

- 最初,候选函数是初始化列表   类T的构造函数(8.5.4)和参数列表由   初始化列表作为单个参数。

     

- 如果没有可行性   找到初始化列表构造函数,重载解析是   再次执行,其中候选函数都是   类T的构造函数和参数列表由   初始化列表的元素。

std::string有很多constructors。其中一个,收到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"};
}

Live version