Я забыл как программировать?
Jan. 30th, 2007 08:04 pmВыжимка этого кода:
typedef union { char a; } u;
typedef struct{ u a1; } s;
void foo(u *up) { s s1 = { *up }; }Приводит к
error C2440: 'initializing' : cannot convert from 'u' to 'char'Кротофф, скажи что я лох?
Re: Ты лох
Date: 2007-01-30 07:42 pm (UTC)Re: Ты лох
Date: 2007-01-30 07:45 pm (UTC)no subject
Date: 2007-01-30 07:50 pm (UTC)no subject
Date: 2007-01-30 07:59 pm (UTC)no subject
Date: 2007-01-30 09:14 pm (UTC)Сегодня уже ничего не соображаю, завтра посмотрю нормативные акты подробнее (прошли те времена, когда все эти завихи помнил хорошо).
no subject
Date: 2007-01-31 09:55 am (UTC)Разбираем:
void foo(u *up) {
s s1 = { *up };
s s2 = { up->a };
u s3 = *up;
u s4 = up->a;
#ifdef __cplusplus
u s5(*up);
u s6(up->a);
#endif
}
По правилам с++ ошибкочными будут инициализации s4 и s6.
s1 пройдет по правилам агрегатной инициализации по той причине, что у u есть конструктор копирования. А по правилам 8.5.1 p12 это правило применяется первым, до попытки непосредственной почленной инициализации агрегата.
По правилам c при агрегатной инициализации union сам по-себе объект union не инициализируется (у него нет конструкторов, в том числе копикрота), и правила применяются рекурсивно к его первому члену. В данном случае к a, и получаем, что массив можно инициализировать только почленно.
The initializer for a structure or union object that has automatic storage duration shall be either an initializer list as described below, or a single expression that has compatible structure or union type. In the latter case, the initial value of the object, including unnamed members, is that of the expression.
Вот как в данном случае я бы интерпретировал талмуд.
Но то, что gcc это правило нарушает грехом считать отказываюсь.
no subject
Date: 2007-01-31 01:41 pm (UTC)1. Почему тогда работает
s3?2. Ты получишь ту же самую ошибку, если
aне будет массивом, но тогда есть workaround в виде s4.no subject
Date: 2007-01-31 01:46 pm (UTC)no subject
Date: 2007-01-31 01:50 pm (UTC)Да, спасибо, похоже что я таки лох, но в таком месте это не стыдно :-)