/Zc:rvalueCast(强制实施类型转换规则)
指定 /Zc:rvalueCast
选项时,编译器将右值引用类型正确标识为转换操作的结果。 其行为符合 C++11 标准。 未指定该选项时,编译器行为与 Visual Studio 2012 中的行为相同。
语法
/Zc:rvalueCast
/Zc:rvalueCast-
备注
如果指定了 /Zc:rvalueCast
,则编译器遵循 C++11 标准的 5.4 节,并只将导致非引用类型的转换表达式和导致对非函数类型的右值引用的转换表达式视为右值类型。 或者默认情况下,如果指定了 /Zc:rvalueCast-
,则编译器不符合标准,并且它将所有导致右值引用的转换表达式都视为右值。 若要在使用转换时符合规范并消除错误,我们建议你使用 /Zc:rvalueCast
。
默认情况下,/Zc:rvalueCast
处于关闭状态(/Zc:rvalueCast-
)。 /permissive- 编译器选项隐式设置此选项,但可以使用 /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
时采用了由标识转换创建的右值的地址,则编译器不会报告错误:
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-
。 选择“确定”或“应用”以保存更改。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈