[英]Direct vs uniform initialization in std::allocator
这个问题也已提交给Usenet,它更合适,但这是一个更大,更可靠的论坛。
std::allocator::construct
被定义为使用括号将其参数参数包转发到对象构造,即直接初始化。
如果它使用大括号,即统一初始化,我们可以从诸如std::make_shared
和container::emplace
类的函数初始化聚合数据类型。 此外,将初始化列表的内容放入此类函数的参数列表中是可以接受的,从而解决了转发时initializer_list
类型推导的问题。
这个选择是否被考虑和拒绝了? 切换到未来的标准是否为时已晚? 这似乎是一个突破性的变化,但不是特别令人发指的变化。
我不知道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 {}
也很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.