/Zc:rvalueCast (Typkonvertierungsregeln erzwingen)
Wenn die Option /Zc:rvalueCast angegeben ist, identifiziert der Compiler ordnungsgemäß einen rvalue-Verweistyp als Ergebnis eines Umwandlungsvorgangs entsprechend dem Standard C++11. Wenn diese Option nicht angegeben ist, entspricht das Compilerverhalten dem von Visual Studio 2012. /Zc:rvalueCast ist standardmäßig deaktiviert. Zur Erhaltung der Konformität und um Fehler bei der Verwendung von Umwandlungen zu vermeiden, wird empfohlen, /Zc:rvalueCast zu verwenden.
/Zc:rvalueCast[-]
Hinweise
Wenn /Zc:rvalueCast angegeben wird, folgt der Compiler Abschnitt 5.4 des C++11-Standards und behandelt nur Umwandlungsausdrücke als rvalue-Typen, die zu Typen ohne Verweis führen sowie Umwandlungsausdrücke, die zu rvalue-Verweisen zu Nichtfunktionstypen führen. Standardmäßig oder wenn /Zc:rvalueCast- angegeben wird, ist der Compiler nicht konform und behandelt alle Umwandlungsausdrücke, die zu rvalue-Verweisen führen, als rvalues.
Verwenden Sie /Zc:rvalueCast, wenn Sie einen Umwandlungsausdruck als Argument an eine Funktion übergeben, die einen rvalu-Verweistyp akzeptiert. Das Standardverhalten verursacht Compilerfehler C2664, wenn der Compiler fälschlicherweise den Typ des Umwandlungsausdrucks bestimmt. Dieses Beispiel demonstriert einen Compilerfehler im korrekten Code, wenn "/Zc:rvalueCast" nicht angegeben ist:
// 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));
}
};
Das standardmäßige Compilerverhalten meldet möglicherweise keinen Fehler C2102, wenn dies angemessen ist. In diesem Beispiel meldet der Compiler keinen Fehler, wenn die Adresse eines durch Identitätsumwandlung erstellten rvalue verwendet wird, wenn /Zc:rvalueCast nicht angegeben ist:
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
}
Weitere Informationen über Konformitätsprobleme in Visual C++ finden Sie unter Nicht dem Standard entsprechendes Verhalten.
So legen Sie diese Compileroption in der Visual Studio-Entwicklungsumgebung fest
Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Ausführliche Informationen finden Sie unter Arbeiten mit Projekteigenschaften.
Wählen Sie den Ordner C/C++ aus.
Wählen Sie die Eigenschaftenseite Befehlszeile aus.
Ändern Sie die Eigenschaft Zusätzliche Optionen, damit sie /Zc:rvalueCast einschließt, und wählen Sie dann OK aus.