2014-10-28 4 views
-1
#include <fstream> 
#include <iostream> 

class Bar { }; 

class Foo { 
    public: 
    Foo(Bar&) { } 
}; 

int main() 
{ 
    Foo bar(Bar()); 
} 

Что возвращает Bar(), и почему этот код скомпилирован?Передача возвращаемого значения конструктора в качестве аргумента

+0

«Почему эта компиляция?» Измените 'main' на' Foo bar ((Bar())); 'чтобы увидеть, что код с поведением, который вы хотите, не компилирует :-) – dasblinkenlight

ответ

1

На самом деле не имеет значения, что возвращает Bar(), потому что это на самом деле ничего не делает! Заявление

Foo bar(Bar()); 

является объявлением функции, объявив функцию bar которая возвращает Foo и принимает функцию не принимая никаких аргументов и возвращает Bar в качестве аргумента. Этот вид декларации известен как Most Vexing Parse.

Предполагая, что заявление было написано в качестве

Foo bar{Bar()}; 

выражение Bar() создаст временный объект типа Bar путем вызова Bar «s конструктор по умолчанию. Конечно, код не будет компилироваться, потому что вы не можете привязать временный код, созданный Bar(), к ссылочной ссылке l 0 const, что и ожидает конструктор Foo.

+0

Я скорректировал программу с помощью строки Foo bar {Bar ()}; в visual studio 2014, и он составлен отлично. Это вина в визуальной студии? –

Смежные вопросы