Часто задаваемые вопросы верны, несмотря на интуицию
(@ lubgr указал соответствующий ответ на другой вопрос)
Спецификация языка говорит:
Если аргумент является либо именем объекта / функции, не заключенным в скобки ..., тогда тип decltype определяет объявленный тип объекта, указанный в этом выражении.
Если аргументявляется любым другим выражением типа T, тогда ... b) если категория значения выражения lvalue, тогда decltype указывает T & ... Обратите внимание, что если имя объекта заключено в скобки, оно становится выражением lvalue, таким образом decltype(arg) и decltype ((arg)) часто бывают разных типов.
Таким образом, регистр без скобок является исключительным / специальным случаем, очевидно введенным для облегчения возврата ссылок с помощью decltype (auto);без специального регистра действует правило @StoryTeller в кавычках:
Если выражение изначально имеет тип «ссылка на T» ([dcl.ref], [dcl.init.ref]), тип корректируется до T перед любым дальнейшим анализом.
, и это может затруднить возврат ссылок.
Определенно ранжируется там с другими определениями магии, такими какпорядок уничтожения кортежей или пустых строк, имеющих 0 с индексом 0, временное продление времени жизни со ссылками и другие подобные чудеса ...