Действительно ли Ideone и Codepad не поддерживают C++03?
Мой вопрос связан с вопросом Prasoon Saurav о не POD-типах и инициализации значений.
Я попробовал следующий код на онлайн-компиляторах, таких как Ideone и Codepad, но исполняемые файлы дали ошибку времени выполнения на обоих сайтах.
#include <iostream>
#include <cassert>
struct Struct {
std::string String;
int Int;
bool k;
};
struct InStruct:Struct
{
InStruct():Struct(){}
};
int main()
{
InStruct i;
assert ( i.Int == 0);
std::cout << "Hello";
}
Выход Ideone здесь
Вывод кодовой панели здесь
Означает ли это, что ни один из них не поддерживает функцию инициализации значения C++03?
3 ответа
Означает ли это, что ни один из них не поддерживает функцию инициализации значения C++03?
Да.
До версии 4.4 GCC не полностью поддерживал инициализацию значения ( заголовок совместимости Boost GCC объясняет это и имеет ссылки на соответствующие отчеты о дефектах GCC; см. Строку 77).
Если ваш код должен быть переносимым, вы должны быть очень осторожны, полагаясь на инициализацию значения; GCC не поддерживал его полностью до недавнего времени, и Visual C++ не полностью поддерживает его даже в его последней версии, Visual C++ 2010.
Декларация
InStruct i;
не вызывает инициализацию значения
$8.5.3/10 - "Объект, инициализатором которого является пустой набор скобок, т. Е. (), Должен быть инициализирован значением".
Если вы хотите инициализировать значение, вам потребуется выражение что-то вроде
assert(InStruct().Int == 0);