std :: allocator中的直接与统一初始化

时间:2011-10-19 10:50:39

标签: c++ c++11 uniform-initialization

  

此问题也已提交给Usenet,它更合适,但这是一个更大,更可靠的论坛。

std::allocator::construct被定义为转发其参数参数 使用括号打包到对象构造,a.k.a。直接初始化。

如果它使用大括号,a.k.a。统一初始化,我们可以初始化 汇总来自std::make_shared和...等函数的数据类型 container::emplace。此外,放置内容也是可以接受的 一个初始化列表到这样一个函数的参数列表中, 解决initializer_list类型扣除问题 转发。

此替代方案是否被考虑并被拒绝?切换是否为时已晚 在未来的标准?这似乎是一个突破性的变化,但是 不是特别令人发指的。

1 个答案:

答案 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 {}也没问题。