/Zc:rvalueCast (型変換規則の適用)
/Zc:rvalueCast オプションを指定した場合、コンパイラは C++11 標準に従いキャスト操作の結果として右辺値参照型を正しく認識します。 このオプションを指定しない場合、コンパイラの動作は Visual Studio 2012 での動作と同じです。 既定では、/Zc:rvalueCast は無効になっています。 標準に準拠し、キャスト使用時のエラーを回避するために、/Zc:rvalueCast の使用をお勧めします。
/Zc:rvalueCast[-]
解説
/Zc:rvalueCast が指定されると、コンパイラは C++11 標準のセクション 5.4 に従って、非参照型になるキャスト式と、非関数型への右辺値参照になるキャスト式のみを右辺値参照型として扱います。 /Zc:rvalueCast- が指定されている場合、または既定では、コンパイラは非準拠となり、右辺値参照になるすべてのキャスト式を右辺値として扱います。
/Zc:rvalueCast は、右辺値参照型を受け取る関数に引数としてキャスト式を渡す場合に使用します。 コンパイラが誤ってキャスト式の型を決定すると、既定の動作ではコンパイラ エラー C2664 が発生します。 この例では、/Zc:rvalueCast を指定しない場合に、正しいコードでコンパイラ エラーが表示されます。
// Test of /Zc:rvalueCast
// compile by using:
// cl /c /Zc:rvalueCast- make_thing.cpp
// cl /c /Zc:rvalueCast make_thing.cpp
#include <utility>
template <typename T>
struct Thing {
// Construct a Thing by using two rvalue reference parameters
Thing(T&& t1, T&& t2)
: thing1(t1), thing2(t2) {}
T& thing1;
T& thing2;
};
// Create a Thing, using move semantics if possible
template <typename T>
Thing<T> make_thing(T&& t1, T&& t2)
{
return (Thing<T>(std::forward<T>(t1), std::forward<T>(t2)));
}
struct Test1 {
long a;
long b;
Thing<long> test() {
// Use identity casts to create rvalues as arguments
return make_thing(static_cast<long>(a), static_cast<long>(b));
}
};
コンパイラの既定動作では、場合によっては C2102 エラーが報告されないことがあります。 この例で、/Zc:rvalueCast を指定しない場合、ID のキャストによって作成された右辺値のアドレスを受け取ることができなくても、コンパイラはエラーを報告しません。
int main() {
int a = 1;
int *p = &a; // Okay, take address of lvalue
// Identity cast creates rvalue from lvalue;
p = &(int)a; // problem: should cause C2102: '&' requires l-value
}
Visual C++ の準拠に関する問題の詳細については、「非標準動作」を参照してください。
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、「プロジェクトのプロパティの操作」を参照してください。
[C/C++] フォルダーを選択します。
[コマンド ライン] プロパティ ページを選択します。
/Zc:rvalueCast が含まれるように "追加オプション" プロパティを変更し、[OK] をクリックします。