Прямая инициализация против инициализации значения

Я программист на C, пытаюсь выучить C ++ 11 и столкнулся с тем, чего не понимаю. Из того, что я могу сказать, следующая проблема — это разница между инициализацией значения и прямой инициализацией.

Следующий фрагмент кода не компилируется с использованием Visual Studio:

class TestClass {
int _val;
std::string _msg;
public:
TestClass(int, std::string);
void action();
};

TestClass::TestClass(int val, std::string msg)
: _val{val}, _msg{msg}
{
}

void TestClass::action()
{
std::cout << _msg << _val << std::endl;
}

Это дает мне:

ошибка C2797: ‘TestClass :: _ msg’: инициализация списка внутри списка инициализатора элемента или не статического инициализатора элемента данных не реализована

Тем не менее, изменение

TestClass::TestClass(int val, std::string msg)
: _val{val}, _msg{msg}

в

TestClass::TestClass(int val, std::string msg)
: _val{val}, _msg(msg)

исправляет мою проблему В чем разница между этими двумя формами инициализации и когда одна из них должна использоваться поверх другой? Меня убеждают, что я должен использовать инициализацию значений всякий раз, когда имеем дело с явными типами.

2

Решение

Это деталь реализации компилятора Visual C ++. Вы можете прочитать больше об этой ошибке Вот. На странице указано:

Компилятор C ++ в Visual Studio не реализует инициализацию списка ни в списке инициализатора элемента, ни в не статическом инициализаторе элемента данных

Ваш код пытается реализовать первый случай. Предложенное вами решение решает эту проблему, но если вы все еще предпочитаете использовать список инициализаторов в конструкторе, вы можете сделать это:

TestClass::TestClass(int val, std::string msg)
: _val{val}, _msg(std::string{msg})

Который будет работать, как вы намерены.

3

Другие решения


По вопросам рекламы [email protected]