Инициализаторы скобок или равных в анонимной структуре не работают на VS2013
Инициализаторы Brace-or-equal в анонимной структуре внутри структуры не выполняют свою работу над выводом, созданным VS2013. Там код:
#include <iostream>
#include <cstdint>
struct S
{
struct
{
uint64_t val = 0;
}anon;
};
int main()
{
S s;
S *a = new S;
std::cout << s.anon.val << std::endl;
std::cout << a->anon.val << std::endl;
return 0;
}
Скомпилируйте эту команду в Linux:
g++ -std=c++11 def-init-anon-atruct.cpp -o def-init-anon-atruct
(Добавление флагов оптимизации не влияет на результат)
Ожидаемый результат:
0
0
Weird. Запуск этого с VS2013 дает значения мусора. Кто прав на это с точки зрения реализации стандартов C++11? Я очень сомневаюсь, что это вина GCC.
Это как-то связано с бесполезными опциями компилятора VS? Расширения Windows? Я должен сделать конструкторы по умолчанию для структур из-за ошибки MS? это абсурд.
2 ответа
Инициаторы нестатических элементов данных, которые игнорируются во вложенных анонимных структурах, являются подтвержденной ошибкой в Visual C++ 2013, исправленной в Visual C++ 2015 RTM.
Я должен сделать конструкторы по умолчанию для структур из-за ошибки MS? это абсурд.
Да и нет, это не абсурдно.
Компиляторы также являются программами и имеют тенденцию к ошибкам - некоторые больше, чем другие.
Если у вас нет выбора в отношении инструмента, вам придется работать с ограничениями инструмента, какими бы абсурдными это ни звучало в теории.