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