GCC decltype (auto) не соответствует стандарту? - PullRequest
0 голосов
/ 18 ноября 2018

Я попытался скомпилировать этот код 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 не соответствует стандарту или мне чего-то не хватает?

1 Ответ

0 голосов
/ 18 ноября 2018

Ваше рассуждение обоснованно.И я думаю, что вижу, где сработает GCC.

Формулировка decltype(auto) гласит, что auto заменено на выражение в инициализаторе.Что в соответствии с GCC будет означать, что ваш код не эквивалентен

decltype(a) b = a;

, а скорее эквивалентен

decltype((a)) b = a;

Но это неправильно.Инициализатор - это "не выраженное в скобках id-выражение" , поэтому правила в [dcl.type.simple] для не заключенных в скобки id-выражений должны применяться нормально.Тип b должен быть выведен как int&&.


А так как @ Aconcagua удалось выкопать, это известная ошибка GCC .

...