std::分配器中的直接初始化与统一初始化

Direct vs uniform initialization in std::allocator

本文关键字:初始化 分配器 std      更新时间:2023-10-16

这个问题也已经提交给了Usenet,在那里它更合适,但这是一个更大、更可靠的论坛

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

如果它使用大括号,也就是统一初始化,我们就可以初始化从函数(如std::make_sharedcontainer::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 {}也可以。