Nar*_*rek 0 c++ stdstring initialization-list uniform-initialization c++11
我可以看到std :: string只有一个CTOR initializer_list:string (initializer_list<char> il);所以初始化列表应该与chars一起使用,对吧?为什么std::string{"some_str"}有效,它得到了const char*,对吧?
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() );
Run Code Online (Sandbox Code Playgroud)
你可以用简单的例子来检查它:
#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"};
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
225 次 |
| 最近记录: |