Различные способы использования аргумента по умолчанию для конструктора в переполнении стека

В чем разница между следующими тремя частями кода в отношении MSVC?

Код 1:
Foo Ctor определяется как:

Foo::Foo(Bar &bar = Bar());

Foo Ctor используется как:

Foo foo = new Foo();

Код 2:
Foo Ctor определяется как:

Foo::Foo()
{
Bar bar = Bar();
Foo(bar);
}

Foo::Foo(Bar &bar);

Foo Ctor используется как:

Foo foo = new foo();

Код 3:
Foo Ctor определяется как:

Foo::Foo(Bar &bar);

Foo Ctor используется как:

Bar bar = Bar();
Foo foo = new foo(bar);

Редактировать:
Внесены исправления в код. Намерение состояло в том, чтобы объяснить идею, не сосредотачиваясь на коде, поэтому сделал ошибку. Извини за это.

Вопрос, в частности, заключается в том, чтобы выяснить разницу между кодами 2 и 3. По какой-то причине в случае кода 2 потребитель ctor класса Foo приводит к сбою, а в случае кода 3 — нет. У меня нет конкретного кода потребителя, поэтому я не могу понять его сам.

-1

Решение

В первых двух вы даже не вызываете конструктор, вы объявляете функцию:

Foo foo(); // function foo, returns a Foo object

По умолчанию построить Foo, тебе нужно

Foo foo;   // C++11 and C++03
Foo foo{}; // C++11

Большая часть вашего кода либо незаконна, либо не выполняет то, что вы ожидаете. Например, этот конструктор не делает ничего, кроме создания локального Bar переменная barи попытка создать тип экземпляра Foo с тем же именем:

Foo::Foo()
{
Bar bar = Bar(); // local variable bar
Foo(bar);        // error: 'bar' has a previous declaration as 'Bar bar'
}
3

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

Других решений пока нет …

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