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

Nub*_*ase 2 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;
}
Run Code Online (Sandbox Code Playgroud)

编译器:g ++ 5.1

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

明确地声明它(取消注释LINE 2)可行.这是一个错误吗?

Ben*_*ley 6

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