Meyers:
NI>>Выражения никогда не имеют ссылочный тип. Типом выражения d1() будет d1.
M>Вот прям никогда
M>3 If the postfix-expression designates a destructor, the type of the function call expression is void; otherwise, the type of the function call expression is the return type of the statically chosen function (i.e., ignoring the virtual keyword), even if the type of the function actually called is different. This return type shall be an object type, a reference type or cv void.
Разбирали уже много раз: the type of the function call expression, о котором там идёт речь, и окончательно установленный тип выражения — это две разные вещи. Окончательно установленный (т.е. фактический) тип выражения получается после всех трансформаций, описанных в [expr]/5 и [expr]/6. Попытка получить выражение ссылочного типа мгновенно превращает его в glvalue нессылочного типа. Все остальные правила стандарта (кроме [expr]/5 и [expr]/6, предназначением которых является установление фактического типа выражения), где описывается какая-либо зависимость от типа выражения, под типом выражения подразумевают именно его окончательно установленный тип (который в силу [expr]/5 ссылочным быть не может никогда).
Meyers:
NI>>и не поверил своим глазам: MSVC++ рвёт сразу G++ и Clang++ по части соответствия стандарту: первый компилирует пример корректно, другие два — нет. Кто б мог подумать, а?
M>Это второе известное мне место, где MSVC++ рвёт g++ и clang++ по части соответствия стандарту.
Как выяснилось позже, всё-таки не рвёт.
N. I.:
NI>Meyers:
NI>>>Выражения никогда не имеют ссылочный тип. Типом выражения d1() будет d1.
M>>Вот прям никогда
M>>3 If the postfix-expression designates a destructor, the type of the function call expression is void; otherwise, the type of the function call expression is the return type of the statically chosen function (i.e., ignoring the virtual keyword), even if the type of the function actually called is different. This return type shall be an object type, a reference type or cv void.
NI>Разбирали уже много раз: the type of the function call expression, о котором там идёт речь, и окончательно установленный тип выражения — это две разные вещи. Окончательно установленный (т.е. фактический) тип выражения получается после всех трансформаций, описанных в [expr]/5 и [expr]/6. Попытка получить выражение ссылочного типа мгновенно превращает его в glvalue нессылочного типа. Все остальные правила стандарта (кроме [expr]/5 и [expr]/6, предназначением которых является установление фактического типа выражения), где описывается какая-либо зависимость от типа выражения, под типом выражения подразумевают именно его окончательно установленный тип (который в силу [expr]/5 ссылочным быть не может никогда).
Ладно, ладно. Я знаю, как это работает.
Но есть известные люди в C++ тусовке, в честь одного из них я назвал этот аккаукн, которые считают, что "Выражения никогда не имеют ссылочный тип" — говорить нельзя, т.к. имеют.
Кстати, некоторое время назад про unqualified-id было сказано, что тип выражения совпадает с типом штуки, которую обозначает unqualified-id. Сегодня посмотрел, а там всё переписали. Такими темпами скоро перепишут [expr.call]/3 и вышеназванному известному персонажу не на что будет ссылаться для обоснования своей т.з. что выражения имеют ссылочный тип.