Re[7]: ternary для разных подклассов на стеке
От: N. I.  
Дата: 24.03.18 08:09
Оценка:
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 ссылочным быть не может никогда).
Re[5]: ternary для разных подклассов на стеке
От: N. I.  
Дата: 24.03.18 08:19
Оценка:
Meyers:

NI>>и не поверил своим глазам: MSVC++ рвёт сразу G++ и Clang++ по части соответствия стандарту: первый компилирует пример корректно, другие два — нет. Кто б мог подумать, а?


M>Это второе известное мне место, где MSVC++ рвёт g++ и clang++ по части соответствия стандарту.


Как выяснилось позже, всё-таки не рвёт.
Re[8]: ternary для разных подклассов на стеке
От: Meyers  
Дата: 24.03.18 16:24
Оценка:
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 и вышеназванному известному персонажу не на что будет ссылаться для обоснования своей т.з. что выражения имеют ссылочный тип.
Re[6]: ternary для разных подклассов на стеке
От: Meyers  
Дата: 24.03.18 16:24
Оценка:
N. I.:

NI>Meyers:


NI>>>и не поверил своим глазам: MSVC++ рвёт сразу G++ и Clang++ по части соответствия стандарту: первый компилирует пример корректно, другие два — нет. Кто б мог подумать, а?


M>>Это второе известное мне место, где MSVC++ рвёт g++ и clang++ по части соответствия стандарту.


NI>Как выяснилось позже, всё-таки не рвёт.


А подробнее?
Re: ternary для разных подклассов на стеке
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 24.03.18 16:29
Оценка: +1
Здравствуйте, tdiff, Вы писали:

T>Хочется в зависимости от условия создавать на стеке объекты разных подтипов одного общего класса, но пока не получается:



А если выделить нужное количество памяти на стеке при помощи alloca, а натравить на эту память оператор new? я не помню, как такая форма называется, но вроде как-то можно. Ну, а потом уже взять указатель/ссылку на этот объект и присвоить куда надо
Маньяк Робокряк колесит по городу
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.