-1

なぜこれが起こっているのかよくわかりません。

次のように宣言された関数がいくつかあります。

std::string unmaskString(std::string &oValue);

コードで私はこれを行います:

v = unmaskString(line.substr(eq+1));

そして、次のようなコンパイル エラーが表示されます。

error: invalid initialization of non-const reference of type 'std::string&' from a temporary of type 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >'

これを2つの別々のステートメントに入れると、うまくいきます:

v = line.substr(eq+1);
v = unmaskString(v);

最初の行は参照ではなく文字列オブジェクトを返すため、エラーの意味がよくわかりません。

機能を

    std::string unmaskString(std::string oValue);

また、そのエラーが発生します。

アップデート:

これは間違いだったので、maskString を unmaskString に変更しましたが、masString が同じ署名を持っているため、問題は依然として適用されます。

4

1 に答える 1

7

結果として:

line.substr(eq+1)

型の一時オブジェクトですstd::string。一時は右辺値であり、左辺値参照は右辺値にバインドできません。

maskString()関数がその引数を変更する必要がない場合 (なぜそれ以外を返すのstd::stringでしょうか?)、その引数を non- への参照として受け入れる理由がないことに注意してくださいconst

考えられる解決策は次のとおりです (優先順)。

  • maskString()その入力を valueで取得して、入力引数が左辺値の場合はコピーされ、右辺値の場合は移動されるようにします。

    std::string maskString(std::string oValue);
    //                     ^^^^^^^^^^^
    {
        // Whatever is going on...
        return oValue; // This will be MOVED into the object that stores
                       // the value returned by this function
    }
    
  • への左辺maskString()値参照によって入力を取得しconst(この方法では、引数が一時的なものであってもvaluefromの初期化によりoValue常にコピーが作成されます)、それを一時変数にコピーします。この変数は、最終的に返されて移動されます。左辺値参照は右辺値 (したがって一時変数) にバインドconst できるため、これは機能します。

    std::string maskString(std::string const& oValue);
    //                                 ^^^^^
    {
        std::string value = oValue;
    
        // Whatever is going on...
        return value; // This will be MOVED into the object that stores
                      // the value returned by this function
    }
    
  • から返されたオブジェクトを名前付きオブジェクトに格納し、substrそのオブジェクトを に渡しますunmaskString()

于 2013-04-21T12:05:36.780 に答える