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