/Zc:rvalueCast (型変換規則の適用)
/Zc:rvalueCast
オプションを指定した場合、コンパイラでは、キャスト操作の結果として rvalue 参照型を正しく識別します。 その動作は C++11 標準に準拠しています。 このオプションを指定しない場合、コンパイラの動作は Visual Studio 2012 での動作と同じです。
構文
/Zc:rvalueCast
/Zc:rvalueCast-
解説
/Zc:rvalueCast
が指定されると、コンパイラでは C++11 標準のセクション 5.4 に従って、非参照型になるキャスト式と、非関数型への rvalue 参照になるキャスト式のみを rvalue 型として扱います。 /Zc:rvalueCast-
が指定されている場合、または既定では、コンパイラは非準拠となり、rvalue 参照になるすべてのキャスト式を rvalue として扱います。 標準に準拠させ、キャスト使用時のエラーを回避するために、/Zc:rvalueCast
の使用をお勧めします。
既定では、/Zc:rvalueCast
はオフ (/Zc:rvalueCast-
) になっています。 /permissive- コンパイラ オプションでは、このオプションを暗黙的に設定しますが、/Zc:rvalueCast-
を使用してオーバーライドできます。
/Zc:rvalueCast
は、rvalue 参照型を受け取る関数にキャスト式を引数として渡す場合に使用します。 コンパイラで誤ってキャスト式の型を決定すると、既定の動作ではコンパイラ エラー 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 のキャストによって作成された rvalue のアドレスを受け取ったときに、コンパイラでエラーを報告しません。
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++ の準拠に関する問題について詳しくは、「 Nonstandard Behavior」をご覧ください。
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。
[構成プロパティ]>[C/C++]>[言語] プロパティ ページを選択します。
[型変換規則の適用] プロパティを
/Zc:rvalueCast
または/Zc:rvalueCast-
に設定します。 [OK] または [適用] を選択して、変更内容を保存します。