Инициализаторы скобок или равных в анонимной структуре не работают на 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? это абсурд.

Да и нет, это не абсурдно.

Компиляторы также являются программами и имеют тенденцию к ошибкам - некоторые больше, чем другие.

Если у вас нет выбора в отношении инструмента, вам придется работать с ограничениями инструмента, какими бы абсурдными это ни звучало в теории.

Другие вопросы по тегам