Рассмотрим следующую программу, которая плохо образованный в соответствии со стандартомИнициализировать больше, чем одну не статический член данных объединения
union Test {
int s{3};
float f;
Test() {}
Test(float f) : f(f) {} // this should be error
};
int main() {
}
C++ 11 стандартного N3376 пункта 12 раздела 6.2.8 говорит, что (курсив мой):
попытка инициализации более чем один не статический член данных в союза оказывает программу некорректные.
Но все популярные компиляторы 3 (g ++, clang ++, MSVC++) компилируются выше, не производя компиляторской ошибки или предупреждения. Я думаю, что компилятору необходимо дать диагноз в этой программе. & Программа должна завершиться неудачей при компиляции.
См. Демонстрационную версию live на g ++ here.
См. Демонстрационную версию live на clang ++ here.
Все ли компиляторы разбиты здесь в соответствии со стандартом? Это ошибка компилятора?
Именование параметров 's',' f' или 'data' ничего не меняет. Он используется для инициализации члена 'f'. – Nelfeal
@ Nelxiost, Насколько я понимаю, проблема OP заключается не в присвоении имен переменных, он изменил имена, пытаясь сделать их более ясными для читателей. Проблема заключается в том, как это может компилироваться в этих компиляторах, пока программа считается ** плохо сформированной ** в стандарте. – Mike
@Mike: Посмотрите, что я нашел здесь нечто похожее: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1562 – Destructor