/Zc:rvalueCast (Wymuszanie zasad konwersji typów)
Gdy /Zc:rvalueCast określono opcję, kompilator poprawnie rozpoznaje typ odwołania rvalue jako wynik operacji rzutowania zgodnie z C ++ 11 standardowych.Zachowanie kompilatora opcja nie zostanie określona, jest taka sama, jak w programie Visual Studio 2012.Domyślnie /Zc:rvalueCast jest wyłączona.Aby zgodność i eliminacji błędów w stosowania rzutowania, zalecamy użycie /Zc:rvalueCast.
/Zc:rvalueCast[-]
Uwagi
Jeśli /Zc:rvalueCast jest określony, kompilator postępuje zgodnie z częścią 5.4 C ++ 11 standardowych i traktuje tylko rzutowania wyrażeń, które powodują typów-reference i rzutowania wyrażenia, które spowodować rvalue odwołania do zakresu funkcji typy jako typy rvalue.Domyślnie lub, jeśli /Zc:rvalueCast- jest określony, kompilator jest bez zgodność i traktuje wszystkie wyrażenia rzutowania powodujących odwołania rvalue jako rvalues.
Użyj /Zc:rvalueCast w przypadku przekazania wyrażenie cast jako argument funkcji pobierającej rvalue typ odwołania.Domyślnym zachowaniem powoduje błąd kompilatora C2664 po kompilator niepoprawnie określa typ rzutowania wyrażenia.Ten przykład przedstawia błąd kompilatora w prawidłowego kodu, gdy nie określono /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));
}
};
Domyślnym zachowaniem kompilator nie może zgłaszać błąd C2102, gdy jest to konieczne.W tym przykładzie kompilator nie zgłasza błąd, jeśli adres rvalue utworzone przez tożsamości rzutowania zostanie podjęta po /Zc:rvalueCast nie została określona:
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
}
Aby uzyskać więcej informacji dotyczących zgodności w programie Visual C++, zobacz Niestandardowe zachowanie.
Aby ustawić tę opcję kompilatora w środowisku programowania Visual Studio
Otwórz okno dialogowe projektu Strony właściwości.Szczegółowe informacje – zobacz: Praca z właściwościami projektu.
Wybierz C/C++ folder.
Wybierz stronę właściwości Wiersz polecenia.
Modyfikuj dodatkowe opcje właściwości do włączenia /Zc:rvalueCast , a następnie wybierz OK.