Я читаю заметки о reinterpret_cast и правилах его псевдонимов (http://en.cppreference.com/w/cpp/language/reinterpret_cast).Строгое правило сглаживания
Я написал этот код:
struct A
{
int t;
};
char *buf = new char[sizeof(A)];
A *ptr = reinterpret_cast<A*>(buf);
ptr->t = 1;
A *ptr2 = reinterpret_cast<A*>(buf);
cout << ptr2->t;
Я думаю, что эти правила не применяются здесь:
- Т2 (возможно, резюме квалифицированных) динамический тип объекта
- T2 и T1 оба (возможно, многоуровневые, возможно, cv-квалифицированные на каждом уровне) указатели на один и тот же тип T3 (поскольку C++ 11)
- T2 - это совокупный тип или тип объединения, который содержит один из a (в том числе рекурсивно, элементы субагрегатов и нестатические члены данных объединенных объединений): это позволяет сбрасывать из первого члена структуры и из элемента объединения к структуре/объединению, которая ее содержит.
- Т2 (возможно, резюме квалифицированных) знаком или без знака вариант динамического типа объекта
- Т2 (возможно, резюме квалифицированных) базовый класс динамического типа объекта
- Т2 символ или unsigned char
На мой взгляд, этот код является неправильным. Я прав? Правильно ли код?
С другой стороны, что касается функции соединения (man 2 connect) и struct sockaddr?
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
Например. у нас есть struct sockaddr_in, и мы должны передать его в struct sockaddr. Вышеизложенные правила также не применяются, так ли это неверно?
Сделайте это 'char buf [sizeof (A)]' и gcc обнаружит оба нарушения при -Wstrict-aliasing = 2 – Cubbi
Не 'connect' функция C? – Walter
Да, но я сосредотачиваюсь на struct sockaddr не на функции. – Adam