Я пытаюсь понять неопределенное поведение при нарушении строгого правила псевдонима. Я прочитал много статей о SO, чтобы понять это. Однако остается один вопрос: я не очень понимаю, когда два типа нелегальных псевдонимов. cpp-reference утверждает:
Псевдоним типа
Всякий раз, когда делается попытка прочитать или изменить сохраненное значение объекта типа DynamicType через glvalue типа AliasedType, поведение не определено, если не выполняется одно из следующих условий:
- AliasedType и DynamicType похожи.
- AliasedType - это (возможно, cv-квалифицированный) вариант DynamicType со знаком или без знака.
- AliasedType - это std :: byte, (начиная с C ++ 17) char или unsigned char: это позволяет исследовать объектное представление любого объекта в виде массива байтов.
Я также нашел хороший пример на SO, где я ясно вижу проблему:
int foo( float *f, int *i ) {
*i = 1;
*f = 0.f;
return *i;
}
int main() {
int x = 0;
std::cout << x << "\n"; // Expect 0
x = foo(reinterpret_cast<float*>(&x), &x);
std::cout << x << "\n"; // Expect 0?
}
int
и float
не похожи друг на друга, и эта программа, возможно, сеет хаос. Чего я не вижу и не понимаю, так это следующей модификации:
struct A
{
int a;
};
struct B
{
int b;
};
A foo( A *a, B *b ) {
a->a = 1;
b->b = 0;
return *a;
}
int main() {
A a;
a.a = 0;
std::cout << a.a << "\n"; // Expect 0
a = foo(&a, reinterpret_cast<B*>(&a));
std::cout << a.a << "\n"; // Expect 0?
}
Являются ли A
и B
похожими типами, и все в порядке, или они имеют незаконный псевдоним, и у меня неопределенное поведение. И если это законно, то потому ли, что A
и B
являются агрегатами (если да, что мне нужно изменить, чтобы сделать его неопределенным поведением)?
Будем очень признательны за любые предупреждения и помощь.
РЕДАКТИРОВАТЬ О проблеме дублирования
Мне известно об этом сообщении, но я не вижу, где они поясняют, какие типы похожий. По крайней мере, до такой степени, чтобы я это понял. Поэтому было бы любезно, если бы вы не закрывали этот вопрос.
A
иB
- несвязанные типы. - person bolov   schedule 23.08.2018C
документация по типам ссылается на Совместимые типы en.cppreference.com / w / c / language / type; вC++
документации не указано en.cppreference.com/w/cpp/language/type а>. Таким образом, Совместимые типы не имеет отношения кC++
, а повторяющаяся ссылка объясняет все остальное. В этой области того, что такое объект и как с ним можно манипулировать / ссылаться, есть существенные различия междуC
иC++
. Смешивание терминов из двух стандартов может привести к путанице. - person Richard Critten   schedule 23.08.2018