默认复制赋值运算符未通过is_copy_assignable测试

时间:2015-08-10 00:12:09

标签: c++ c++14

#include <type_traits>

struct A {};
struct B {
  B(A& a) : a(a) {}
  //B& operator=(B const& b) = default;                  // LINE 1
  //B& operator=(B const& b) { a = b.a; return *this; }  // LINE 2

  A& a;
};

static_assert(std::is_copy_constructible<B>::value, ""); // pass
static_assert(std::is_copy_assignable<B>::value, "");    // fail

int main() {
  A a;
  B b(a);
  return 0;
}

编译器:g ++ 5.1

默认的复制构造函数很好,但默认的复制赋值运算符失败(即使LINE 1未注释)。

明确声明(取消注释LINE 2)可以正常工作。这是一个错误吗?

1 个答案:

答案 0 :(得分:6)

不,这不是一个错误。您的类没有定义的复制赋值运算符,因为您有一个引用成员。如果你有一个带引用语义的类,那么你是否希望赋值只是从一个引用分配到另一个引用(这会导致复制分配引用的对象),或引用是否应该反弹(你可以&#39)实际上,虽然这通常是你想要的)。因此,标准根本不会生成默认赋值运算符,但允许您使用所需的语义手动定义一个。