C++ 不可复制但可移动的容器
我对此程序有问题:C++ 不可复制但可移动的容器,c++,c++11,stl,containers,language-lawyer,C++,C++11,Stl,Containers,Language Lawyer,我对此程序有问题: 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; } 然而,如果我取消注释注释行,程序将无法编译。您
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;
}
然而,如果我取消注释注释行,程序将无法编译。您是否认为标准中有一个bug,::std::is_copy_constructible{}
的计算结果为true
,在标准中的什么位置?例如,如果value\u type
不可复制,那么元函数应该是固定的,还是容器应该删除它的复制构造函数
编辑:我想我应该澄清为什么这很重要。比如说,您有一个类模板
variant
,其中包含一个容器类模板,该模板使用不可复制的值\u type
实例化。variant
可以SFINAE
删除复制容器并避免编译错误的方法,但是因为它从STL
接收错误信息,所以它不能。由于这个问题,我不得不编写一个特殊的moving\u variant
类模板,它只移动,从不复制,而可以/应该有一个variant
类模板。是可复制的
是根据是可构造的
定义的,如果这样的表达式格式正确,则为:
T t(create<const T&>())
T(创建())
对于
vector
,这是格式良好的,因为vector
声明了一个合适的副本构造函数。无法实例化构造函数,因为它使用已删除的函数;但是模板在这样一个未赋值的上下文中使用时不会实例化。请注意格式:@MikeSeymour不是从C++11开始的,如果序列是@Simple:好的,我想我的编译器没有跟上这个变化。+1,很有趣。我会说这是一个bug,但不是在标准中,而是在实现中。@user1095108:我不确定我理解你的意思。对我来说,表49非常清楚地说明了应该返回什么是可复制的。这意味着要将解析为可构造的,而20.10.4.3/6规定,为了实现这一点,表达式T(create())
必须格式良好,这不是唯一指针向量的情况(使用草案N3797)。因此实现和标准都是正确的?@user1095108:据我所知,对但是高级语言律师可能会发现我的逻辑有缺陷。我的问题不仅与标准的法律术语有关,还因此导致了现实生活中的错误和崩溃。@user1095108:如果问题是基于意见的“是否应该更改标准”,那么,我对变革的潜在后果没有足够的了解,无法得出客观的看法。还有,那也会是离题的。好吧,但是vector
的构造函数可以复制到SFINAE
d之外吗?我想可以。
T t(create<const T&>())