我对这个程序有疑问:
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/