2016-08-17 14 views
-4
void print_me_bad(std::string& s) { 
     std::cout << s << std::endl; 
    } 

    void print_me_good(const std::string& s) { 
     std::cout << s << std::endl; 
    } 

    std::string hello("Hello"); 

    print_me_bad(hello); // Compiles ok 
    print_me_bad(std::string("World")); // Compile error 
    print_me_bad("!"); // Compile error; 
    print_me_good(hello); // Compiles ok 

    print_me_good(std::string("World")); // Compiles ok 
    print_me_good("!"); // Compiles ok 

上記のコピーコンストラクタのプログラムで、「ワールド」を渡しているときに2番目のケースでコンパイルエラーが発生するのはなぜですか?コピーコンストラクタでコンパイルエラーが発生する

+3

一時は非constに参照するためにバインドすることはできません。 – songyuanyao

+3

あなたが表示するコードのどこにでもコピーコンストラクションはありません。この問題は、左辺値と右辺値の違い(基本的には一時的なオブジェクト)と、定数オブジェクトと非定数オブジェクトの参照の違いと関係しています。 –

+0

一時オブジェクトを参照にバインドする( 'const'は必須です) - https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ – Niall

答えて

0

コメントで説明したように、非const参照に一時オブジェクトをバインドすることはできません。以下の例で

print_me_bad(std::string("World")); // Compile error 
print_me_bad("!"); // Compile error; 

あなたは一時的なのstd ::文字列オブジェクトを作成します。最初に明示的に(std::string("World"))、暗黙的に変換します("!"はstd :: stringに変換されます)。これは許可されていません。

あなたは、しかし、それ以外の場合はうまくコンパイル理由である、constの参照に一時をバインドすることができます。

print_me_good(std::string("World")); // Compiles ok 
print_me_good("!"); // Compiles ok 
関連する問題