Я попытался скомпилировать этот код C ++ в GCC 8.2 с различными параметрами, и он всегда успешно выполняется, не выдает предупреждений и выводит true
:
int && a = 123;
decltype(auto) b = a;
std::cout << std::boolalpha << std::is_same<decltype(b), int&>::value;
Между тем, тот же код не будет компилироваться в Clang, и, если я правильно понимаю стандарт, это поведение, соответствующее стандарту.
cppreference на decltype
:
Если аргумент является не заключенным в скобки id-выражением или не заключенным в скобки выражением доступа к члену класса, тогда decltype возвращает тип объекта, названного этим выражением.
cppreference на decltype(auto)
:
Если объявленный тип переменной - decltype (auto), ключевое слово auto заменяется выражением (или списком выражений) его инициализатора, и фактический тип определяется с использованием правил для decltype.
Следовательно, decltype(auto)
должно дать int&&
. А поскольку a
является lvalue, он не должен связываться с b
, что приводит к ошибке компиляции.
Значит, GCC не соответствует стандарту или мне чего-то не хватает?