Последняя версия clang (3.9) отклоняет этот код во второй строке f
; последняя версия gcc (6.2) принимает его:
struct Y {
Y();
Y(const Y&);
Y(Y&&);
};
struct X {
operator const Y();
};
void f() {
X x;
Y y(x);
}
Если какое-либо из этих изменений сделано, clang примет код:
- Удалить
Y
move constructor - Удалите
const
из оператора преобразования - Замените
Y y(x)
наY y = x
Является ли исходный пример законным? Какой компилятор ошибочен? После проверки разделов о функциях преобразования и разрешении перегрузки в стандарте я не смог найти четкий ответ.