9

次のコードがあります

string three()
{
    return "three";
}

void mutate(string& ref)
{
}

int main()
{
    mutate(three()); 
    return 0;
}

three()mutateメソッドに渡していることがわかります。このコードはうまくコンパイルされます。私の理解では、一時変数を非 const 参照に割り当てることはできません。はいの場合、このプログラムはどのようにコンパイルされていますか?

何かご意見は?

編集:

試したコンパイラ: VS 2008 および VS2010 Beta

4

5 に答える 5

8

以前は VC6 コンパイラでコンパイルされていたので、後方互換性を維持するために、VS2008 はこの非標準拡張機能をサポートしていると思います。/Za (言語拡張機能を無効にする) フラグを試してみると、エラーが発生するはずです。

于 2009-08-28T06:50:42.473 に答える
4

VC++ の邪悪な拡張機能です。/W4 を使用すると、コンパイラから警告が表示されます。Rvalue References: C++0x Features in VC10, Part 2を読んでいると思います。この記事では、その問題についても言及していました。

于 2009-08-28T06:55:24.040 に答える
3

これは、他の多くの Microsoft コンパイラの動作を模倣する Microsoft 拡張機能です。W4 警告を有効にすると、警告が表示されます。

于 2009-08-28T06:53:03.683 に答える
1

少なくとも g++ 4 ではコンパイルされません。

foo.cpp: In function ‘int main()’:
foo.cpp:16: error: invalid initialization of non-const reference of type ‘std::string&’ from a temporary of type ‘std::string’
foo.cpp:10: error: in passing argument 1 of ‘void mutate(std::string&)’

( #include と 'using' 行を追加する必要があったため、行番号は 3 ~ 4 ずれています。)

したがって、コンパイラは本来あるべきほど厳密ではないようです。

于 2009-08-28T06:44:33.093 に答える
0

コンパイラに依存すると思います。g++ 4.1.2 でこれが得られます。

In function 'int main()':
Line 15: error: invalid initialization of non-const reference of type 'std::string&' from a temporary of type 'std::string'
compilation terminated due to -Wfatal-errors.

何もしていないため、呼び出しが最適化されている可能性があります。

于 2009-08-28T06:48:22.740 に答える