Разрешение перегрузки для оператора присваивания копированияC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Разрешение перегрузки для оператора присваивания копирования

Сообщение Anonymous »

Если в дополнение к неявно определенному оператору присваивания копирования класс также определяет оператор = с параметром объекта not lvalue-reference, какой из операторов необходимо выбрать?
Рассмотрим следующий пример, содержащий две структуры, каждая из которых имеет перегруженный оператор присваивания копирования:

Код: Выделить всё

struct A {
int operator =(this const A &, const A&) { return 1; }
operator int() const { return 2; }
};

struct B {
int operator =(this volatile B &, const B&) { return 1; }
operator int() const { return 2; }
};

template
int f(T t) {
return t = T{};
}

int main() {
return 10 * f(A{}) + f(B{});
}
Программа возвращает две цифры. Первая цифра равна 1, если в A a выбран пользовательский оператор =; a = A{}; и 2, если выбран неявно определенный оператор присваивания копирования. Вторая цифра аналогично показывает выбор, но для B b; b = B{}; текущие компиляторы не согласны с возвращаемым значением программы.
Clang возвращает 11, что означает, что оба определяемых пользователем оператора предпочтительнее неявно определенных операторы присваивания копирования.
MSVC возвращает 22, всегда выбирая неявно определенные операторы присваивания копирования вместо пользовательских.
И GCC находится в middle с возвращаемым значением 21. Онлайн-демо: https://gcc.godbolt.org/z/d4hbe7cn8
Какой компилятор здесь правильный?

Подробнее здесь: https://stackoverflow.com/questions/788 ... t-operator
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»