Я мог бы поклясться, что не помню, чтобы я видел это раньше, и мне трудно поверить в мои глаза:
Является ли неявно определенный конструктор по умолчанию для неагрегатного класса инициализировать его члены или нет?
В Visual С++, когда я запускаю этот невидимый код...
#include <string>
struct S { int a; std::string b; };
int main() { return S().a; }
... к моему удивлению, он возвращает ненулевое значение! Но если я удаляю поле b
, то он возвращает ноль.
Я пробовал это во всех версиях VС++, я могу взять себя в руки, и, похоже, все это делает.
Но когда я пытаюсь сделать это на Clang и GCC, значения инициализируются до нуля, пытаюсь ли я его использовать в режиме С++ 98 или С++ 11.
Какое правильное поведение? Не гарантируется ли оно равным нулю?