В соответствии со ссылкой C ++ на Оператор присваивания копии :
Оператор присваивания по умолчанию для класса T определяется как удаленный, если выполняется любое из следующих условий
T имеет нестатический член данных не-классового типа (или его массив), который является константой ...
Я надеялся создать случай, когда у меня был элемент данных типа const и оператор присваивания копии по умолчанию, который не был определен как удаленный. При этом я обнаружил несоответствие между clang и gcc. Рассмотрим следующий код:
struct B {
void operator=(const B&) const {}
};
struct A {
const B b{};
A& operator=(const A&) = default;
};
int main() {
A a1{}, a2{};
a1 = a2; //only works with clang
B b1{}, b2{};
b1 = b2; //works in both
}
Когда я компилирую это с g++ -std=c++14
, я получаю следующие ошибки:
In member function ‘A& A::operator=(const A&)’:
error: non-static const member ‘const B A::b’, can’t use default assignment operator
note: synthesized method ‘A& A::operator=(const A&)’ first required here
Это, однако, запятая, компилируется с clang
, так как ссылка, кажется, указывает, что это должно. Я ошибаюсь? Какой компилятор правильный?
Я использую gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04)
и clang version 6.0.0-1ubuntu2
.