Инициализация значения и не POD типы
Час назад я разместил здесь ответ, который, по моему мнению, был правильным. Однако мой ответ был отклонен Martin B. Он сказал
Вам просто повезло, и вы получаете нули, потому что память, в которую я был помещен, оказалась инициализированной нулями. Это не гарантируется стандартом.
Однако после прочтения ответа Майкла Берра здесь и пробуя следующий пример кода
1)
#include <cassert>
struct B { ~B(); int m; };
int main()
{
B * b = new B();
assert(b->m == 0);
}
Я получил ошибку отладки на MSVC++ 2010.
Я получил похожую ошибку, когда попробовал следующий код [Мой ответ здесь] на MSVC++ 2010
2)
#include <cassert>
struct Struct {
std::string String;
int Int;
bool k;
// add add add
};
struct InStruct : Struct
{
InStruct() : Struct() {}
};
int main()
{
InStruct i;
assert(i.k == 0);
}
ни (1)
ни (2)
дал любую такую ошибку на gcc/Clang, что заставило меня задуматься, если MSVC++ 2010 не поддерживает C++03. Я не уверен.
Согласно сообщению Майкла Берра [на C++ 03]
new B () - инициализирует значение B, которое инициализирует нулями все поля, так как его ctor по умолчанию генерируется компилятором, а не определяется пользователем.
Стандарт говорит
Чтобы инициализировать значение объекта типа Tmeans:
- если T является типом класса (раздел 9) с конструктором, объявленным пользователем (12.1), то вызывается конструктор по умолчанию для T (и инициализация неверна, если в ней нет доступного конструктора по умолчанию);
.....
в противном случае объект инициализируется нулями
С первого момента, если не существует объявленного пользователем конструктора по умолчанию, будет вызван синтезированный конструктор по умолчанию, который будет zero initialize
все поля (согласно последнему пункту).
Так где я не прав? Правильна ли моя интерпретация инициализации значения?
2 ответа
Visual Studio имеет известные ошибки во всех текущих версиях (2005, 2008, 2010), где она неправильно реализует инициализацию значения для типов, не являющихся POD, которые не имеют объявленного пользователем конструктора.
По языковым правилам никто из вас не должен срабатывать, но все же имеет проблемы с компилятором. Это некоторые из отчетов об ошибках, обратите внимание, что все они закрыты или решены как "Не исправлять".
http://connect.microsoft.com/VisualStudio/feedback/details/564268/c-value-initialization
Для людей, которые наткнулись на этот вопрос в 2015 году, как я:
Все вышеперечисленные проблемы были исправлены в VS 2015. Инициализация значения теперь работает, как определено в стандарте.