На самом деле не имеет значения, что возвращает Bar()
, потому что это на самом деле ничего не делает! Заявление
Foo bar(Bar());
является объявлением функции, объявив функцию bar
которая возвращает Foo
и принимает функцию не принимая никаких аргументов и возвращает Bar
в качестве аргумента. Этот вид декларации известен как Most Vexing Parse.
Предполагая, что заявление было написано в качестве
Foo bar{Bar()};
выражение Bar()
создаст временный объект типа Bar
путем вызова Bar
«s конструктор по умолчанию. Конечно, код не будет компилироваться, потому что вы не можете привязать временный код, созданный Bar()
, к ссылочной ссылке l 0 const
, что и ожидает конструктор Foo
.
«Почему эта компиляция?» Измените 'main' на' Foo bar ((Bar())); 'чтобы увидеть, что код с поведением, который вы хотите, не компилирует :-) – dasblinkenlight