不可复制的,但可移动的容器

时间:2014-02-19 11:42:53

标签: 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;
}

输出:

1

然而,如果我取消注释注释行,程序将无法编译。您是否认为,标准中存在错误,::std::is_copy_constructible<decltype(v)>{}评估为true以及标准中的位置?例如,如果value_type不可复制,应该修复元函数,还是容器应该删除它的复制构造函数?

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

1 个答案:

答案 0 :(得分:7)

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

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

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