Динамический тип выражения, имеющего дело с подобъектом базового класса - PullRequest
0 голосов
/ 28 июня 2019

Я снова задаю вопрос, потому что только другой вопрос , который, как это, приближается к 10 годам, и содержит неверную информацию о выражениях, включающих подобъекты базового класса:

[defns.dynamic.type] определяет динамический тип glvalue как:

тип самого производного объекта, к которому относится glvalue

glvalueотносится только к не более чем одному объекту, и, поскольку «самый производный объект», как определено [intro.object] p6 , по существу является:

завершенный объект, член данных,или элемент массива типа класса, или объект не-классового типа называется наиболее производным объектом.

Если glvalue не ссылается на наиболее производный объект, то динамическийтип быть неопределенным?

Кроме того, я знаю, что предполагаемый эффект динамического типа выражения: для выражения glvalue E, которое относится к объекту типа B, который является подобъектом базового класса объекта типаD, где B - это базовый класс D, чтобы получить тип D из E, однако я не вижу, как текущая формулировка выполняет или даже нуждается в этом, поскольку ссылки /указатели типа базового класса, связанные с типом производного класса, всегда будут ссылаться на подобъект базового класса.Насколько я могу судить, случай, когда тип выражения и тип объекта, на который оно ссылается, никогда не возникнет.

Ответы [ 2 ]

5 голосов
/ 28 июня 2019

Если glvalue не ссылается на наиболее производный объект, то будет ли динамический тип неопределенным?

Это всегда так.Следовательно, часть «затем» не применяется.

Обновление в ответ на комментарий

Учитывая

struct foo { };
struct bar : foo { };
const foo& a = bar(); a;

Что такое динамический тип a?

Ответ находится на странице , на которую вы ссылались в своем сообщении :

[ Пример: Если указатель p, статический тип которогоis «указатель на класс B» указывает на объект класса D, производный от B, динамический тип выражения *p равен «D».Ссылки обрабатываются аналогично. - конечный пример ]

Динамический тип a равен bar, а не foo.

3 голосов
/ 28 июня 2019

Я думаю, что вы могли бы утверждать, что это дефект формулировки, но это будет педантично, потому что цель уже ясна. Вместо:

тип самого производного объекта, на который ссылается glvalue

Вы можете себе представить, что определение гласит:

тип самого производного объекта объекта, на который ссылается glvalue

...