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

标签 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 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/

相关文章:

c++ - 获取尺寸较小的矩阵的子矩阵

c++ - Automake 库工具 'No rule to make target'

c++ - 通用 find_if 检查二维数组中的元素

c++ - 如何在不使用模板的情况下进行完美转发?

c++ - 如何在只有 protected 或私有(private)构造函数的类上调用::std::make_shared?

Android 应用程序和开源库

C++ 常量字符

c++ - 将 C++ 添加到 Objective-C,cryptlib.h 和 curl.h 的#include 错误

c++ - 将抽象仿函数分配给 std::function - 为什么 std::ref 是一个解决方案?

c++ - 我们什么时候需要调用 std::string::capacity()?