此问题也已提交给Usenet,它更合适,但这是一个更大,更可靠的论坛。
std::allocator::construct
被定义为转发其参数参数
使用括号打包到对象构造,a.k.a。直接初始化。
如果它使用大括号,a.k.a。统一初始化,我们可以初始化
汇总来自std::make_shared
和...等函数的数据类型
container::emplace
。此外,放置内容也是可以接受的
一个初始化列表到这样一个函数的参数列表中,
解决initializer_list
类型扣除问题
转发。
此替代方案是否被考虑并被拒绝?切换是否为时已晚 在未来的标准?这似乎是一个突破性的变化,但是 不是特别令人发指的。
答案 0 :(得分:9)
我不知道SC考虑了什么,但请记住,统一初始化在通用上下文中并不真正“起作用”(禁止值构造*)。考虑一下这个尝试:
template<typename T, typename... Args>
T
make(Args&&... args)
{
return T { std::forward<Args>(args)... };
}
你得到:
assert( make<std::vector<int>>(10, 0).size() == 2 );
assert( std::vector<int>(10, 0).size() == 10 );
这不会编译:
make<std::vector<int*>>(10u, 0);
然而这样做:
std::vector<int*>(10u, 0);
如果完美转发和初始化程序列表之间的特定交互很快就会形成,我可以看到SC不想从头开始重新启动。
(*):即使在通用上下文中,T {}
也没问题。