Рассмотрим следующий пример, содержащий две структуры, каждая из которых имеет перегруженный оператор присваивания копирования:
Код: Выделить всё
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{});
}
Clang возвращает 11, что означает, что оба определяемых пользователем оператора предпочтительнее неявно определенных операторы присваивания копирования.
MSVC возвращает 22, всегда выбирая неявно определенные операторы присваивания копирования вместо пользовательских.
И GCC находится в middle с возвращаемым значением 21. Онлайн-демо: https://gcc.godbolt.org/z/d4hbe7cn8
Какой компилятор здесь правильный?
Подробнее здесь: https://stackoverflow.com/questions/788 ... t-operator