2011-10-21 5 views
6

私は次のC++のコードを持っている:キャスト++タイプ

#include <iostream> 
#include <string> 

    int main(int argc, char* argv[]) 
    { 
     const std::string s1 = "ddd"; 
     std::string s2(std::string(s1)); 
     std::cout << s2 << std::endl; 
    } 

は、結果は次のとおりです。なぜ? 私は-Wallフラグ、コンパイラの書き込み警告を使用する場合:

#include <iostream> 
#include <string> 

int main(int argc, char* argv[]) 
{ 
    const std::string s1 = "ddd"; 
    std::string s2((std::string)(s1)); 
    std::cout << s2 << std::endl; 
} 

:常に

'真' しかし、このコードとして評価します 'のstd ::文字列s2(STD ::文字列)' のアドレスを結果: DDD

それは正常な結果

+3

は、あなただけの二行目 'のstd ::文字列s2(S1)を作ることができませんでした;'なぜあなたがする必要がありますか2番目の 'std :: string'を含めますか? – rhololkeolke

+1

中間コピーを作成するのはなぜですか?どうして 'std :: string s2 = s1;'? –

+0

@Oscar:あなたのバージョンでは、中間のデフォルトの初期化変数が作成され、次にコピー代入演算子を使用してコピーされます。中間のものがない正しいバージョンはrhoです。 – Xeo

答えて

13

Most-vexing-parseです。

std::string s2(std::string(s1)); 

は「s1という名前std::stringパラメータを取り、std::stringを返す関数」の宣言として解析されます。その関数を印刷しようとすると、最初に関数ポインタ(通常の減衰/変換規則)に変換されます。 operator<<std::ostreamは一般に関数ポインタのためにオーバーロードされていないので、成功したboolへの変換を試行し、関数ポインタはNULLではないため、ブール値trueに変換され、1として出力されます。

std::string s2((std::string(s1))); 

あるいはさらに良いの

変更して、ちょうど

std::string s2(s1); 
+0

または 'std :: string s2 = s1;' –

+1

@Oscar:Copy ctor>コピー代入演算子。 :) – Xeo

+7

'std :: string s2 = s1;'はコピーコンストラクタを宣言しているので、それを呼び出します。 –

関連する問題