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&>())