为什么 std::string{ "const char ptr" } 有效?
Why std::string{"const char ptr"} works?
我可以看到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在重载解析,但它不是可行的候选,当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"};
}
生活版本
相关文章:
- 欧拉项目#8答案是大以获得有效答案
- 调整大小后指向元素值的指针unordered_map有效?
- 为什么是0;C++中的有效语句
- 最高有效数字侧的第N位
- GCC对可能有效的代码抛出init list生存期警告
- 有效地使用std::unordered_map来插入或增加键的值
- c++中O(n^(1/3))中一个数的除数的有效计数
- 使用无符号字符数组有效存储内存
- 自定义先决条件对移动分配运算符有效吗
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 为什么这种直接初始化有效?(C++17)
- 递归函数有效,但无法记忆
- 在C++中初始化向量映射的最有效方法
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 如何检测ptr在引用超出范围后是否仍在引用有效引用
- 为什么 std::string{ "const char ptr" } 有效?