2013-05-28 29 views
5

Znalazłem coś dziwnego, czego nie rozumiem.std :: string s() dziwne zachowanie

std::string a(); 

Po wydrukowaniu zwraca 1. Nie mam pojęcia, skąd się to wzięło. Myślałem, że a() jest konstruktorem bez argumentów, ale wygląda na to, że tak nie jest.

Gdzie mogę znaleźć informacje na ten temat? i co to jest?

A kiedy próbuje zrobić std::string b(a); kompilator krzyczy:

error: no matching function for call to ‘std::basic_string<char>::basic_string(std::string (&)())’ 

Objaśnienie byłoby mile widziane.

+3

Google "C++ najbardziej dokuczliwy parse". – Jon

+6

Zobacz: http://pl.wikipedia.org/wiki/Most_vexing_parse –

+4

Ludzie, po co są wszystkie pochwały? Czy odpowiedź jest tak oczywista, że ​​wszyscy od razu wiedzieli, o co chodzi, kiedy cię ugryzło? Głosowanie, by zamknąć pytanie jako dupek, jest wspaniałe, ale nie rzucajmy ludzi wokół siebie, bo nie wiemy. – Jon

Odpowiedz

5

Jest to deklaracja funkcji, a nie instancji ciąg:

std::string a(); 

Deklaruje funkcję o nazwie a, bez parametrów i zwrócenie std:string. Są dawałaby:

std::string a; // C++03 and C++11 
std::string b{}; // C++11 syntax 
3
std::string a(); 

deklaruje funkcję bez argumentów i std::string jako typ zwracany. Podczas próby drukowania wydrukujesz adres, który jest oceniany jako true.

ostrzeżenie: adres 'std :: string() zawsze będzie oceniać jako „prawdziwy” [-Waddress]