В чем разница между следующими тремя частями кода в отношении 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 — нет. У меня нет конкретного кода потребителя, поэтому я не могу понять его сам.
В первых двух вы даже не вызываете конструктор, вы объявляете функцию:
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'
}
Других решений пока нет …