gpt4 book ai didi

c++ - 不可复制但可移动的容器

转载 作者:IT老高 更新时间:2023-10-28 23:01:42 27 4
gpt4 key购买 nike

我对这个程序有疑问:

struct A {};

int main()
{
::std::vector< ::std::unique_ptr<A> > v;

::std::cout << ::std::is_copy_constructible<decltype(v)>{} << ::std::endl;

//decltype(v) w(v);

return 0;
}

这个输出:

1

但是,如果我取消注释注释行,程序将无法编译。您认为 ::std::is_copy_constructible<decltype(v)>{} 是标准中的一个错误吗?计算结果为 true标准在哪里?例如,是否应该修复元函数,或者容器是否应该删除它的复制构造函数,如果 value_type不可复制?

编辑:我想我应该澄清为什么这很重要。比如说,你有一个类模板 variant ,它包含一个容器类模板,该模板使用不可复制的 value_type 实例化. variant可以SFINAE away 复制容器并避免编译错误的方法,但是因为它从 STL 接收到错误信息,它不能。由于这个问题,我不得不写一个特殊的 moving_variant类模板,只移动,从不复制,而它可以/应该可以有一个 variant类模板。

最佳答案

is_copy_constructible定义为 is_constructible ,如果这样的表达式格式正确,则为真:

T t(create<const T&>())

vector<unique_ptr> 的情况下,这是格式良好的,因为 vector声明了一个合适的拷贝构造函数。构造函数无法实例化,因为它使用了已删除的函数;但是在这样的未评估上下文中使用模板时,不会实例化模板。

关于c++ - 不可复制但可移动的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21879448/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com