2013-05-28 16 views
5

私は理解できない何かを発見しました。std :: string s()strange behavior

std::string a(); 

出力すると、1が返されます。どこから来たのか分かりません。 a()は引数のないコンストラクタだと思っていましたが、そうではないようです。

この情報はどこにありますか?そしてこれは何ですか?

そしてstd::string b(a);コンパイラをやろうと叫ぶ:

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

説明をいただければ幸いです。

+3

Googleの[-Waddress]「真」と評価されます。 – Jon

+6

参照:http://en.wikipedia.org/wiki/Most_vexing_parse –

+4

人々、すべてのdownvotesは何ですか?答えはとても分かりやすいので、皆さんがあなたに噛まれたときの問題がすぐに分かっていましたか?欺瞞としての問題を終わらせるための投票は素晴らしいですが、知らないうちに人々を叩かないようにしましょう。 – Jon

答えて

5

これは、関数の宣言ではなく、文字列のインスタンスである:

std::string a(); 

それはパラメータなしで、aという関数を宣言し、std:stringを返します。これらは、インスタンス化されている:

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

は、戻り値の型として引数なしとstd::stringで関数を宣言します。あなたがそれを印刷しようとすると、アドレスはtrueと評価されています。

警告:のアドレス「のstd ::文字列()」は常に "最も厄介な解析C++"