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

Why std::string{"const char ptr"} works?

本文关键字:ptr 有效 char const string 为什么 std      更新时间:2023-10-16

我可以看到std::string与initializer_list: string (initializer_list<char> il);只有一个CTOR,因此初始化列表应该与字符一起工作,对吗?为什么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在重载解析,但它不是可行的候选,当stringconst 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"};
}

生活版本