Дедукция возвращаемого типа у оператора преобразования
Почему следующий код компилируется?
template<class>
struct A {
operator auto() {
return 42;
}
};
int main() {
int a = A<int>{};
}
А этот не компилируется?
struct A {
template<class>
operator auto() {
return 42;
}
};
int main() {
int a = A{};
}
error: no viable conversion from 'A' to 'int'
Использую gcc. Что интересно, в msvc первый код также не компилируется. Почему?
error C3177: you cannot have a conversion function to a type that contains 'auto'
Ответы (1 шт):
Почему следующий код компилируется?
operator auto() { return 42; }
Здесь auto автоматически определяет возвращаемый тип, как в auto foo() {return 42;}. То есть он заменяется на int.
Что интересно, в msvc первый код также не компилируется. Почему?
Видимо баг. (Это же MSVC.)
А этот не компилируется?
template<class> operator auto() { return 42; }
В стандарте есть прямой запрет на шаблонный operator auto: [class.conf.fct]/6.
Если делаете operator <тип> шаблоном, то шаблонный параметр должен упоминаться в <тип>е, иначе как компилятор будет его выводить?
(Кстати интересно, что A a; a.operator auto(); работает, а A a; a.operator auto<int>(); почему-то нет...)