8

这个问题也已经提交到Usenet,那里比较合适,但这是一个更大更可靠的论坛。

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

如果它使用大括号,也就是统一初始化,我们可以从函数初始化聚合数据类型,例如std::make_sharedcontainer::emplace。此外,可以将初始化列表的内容放入此类函数的参数列表中,从而解决initializer_list转发下的类型推导问题。

是否考虑并拒绝了这种替代方案?转换未来的标准是否为时已晚?看起来这将是一个突破性的变化,但不是特别令人发指的变化。

4

1 回答 1

10

我不知道 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 {}即使在一般情况下也很好。

于 2011-10-19T11:02:06.627 回答