Рассмотрим следующую программу:
struct S {
using T = float;
operator T() { return 9.9f; }
};
int main() {
S m;
S::T t = m;
t = m.operator T(); // Is this correct ?
}
Программа компилируется в g++ (см. живое демо здесь)
Но это не удается в компиляции в clang++, MSVС++ и компиляторе Intel С++
clang++ дает следующие ошибки (см. живое демо здесь)
main.cpp:8:20: error: unknown type name 'T'; did you mean 'S::T'?
t = m.operator T(); // Is this correct ?
^
S::T
main.cpp:2:11: note: 'S::T' declared here
using T = float;
MSVС++ дает следующие ошибки (см. живое демо здесь)
source_file.cpp(8): error C2833: 'operator T' is not a recognized operator or type
source_file.cpp(8): error C2059: syntax error: 'newline'
Компилятор Intel С++ также отклоняет этот код (см. живое демо здесь)
Итак, вопрос в том, какой компилятор здесь? Неверный здесь g++ или другие 3 компилятора здесь неверны? Что говорит об этом в стандарте С++?