Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Po określeniu /Zc:rvalueCast
opcji kompilator poprawnie identyfikuje typ odwołania rvalue w wyniku operacji rzutowania. Jego zachowanie jest zgodne ze standardem C++11. Jeśli opcja jest nieokreślona, zachowanie kompilatora jest takie samo jak w programie Visual Studio 2012.
Składnia
/Zc:rvalueCast
/Zc:rvalueCast-
Uwagi
Jeśli /Zc:rvalueCast
zostanie określony, kompilator jest zgodny z sekcją 5.4 standardu C++11 i traktuje tylko wyrażenia rzutowane, które powodują nieprzywoływane typy i wyrażenia rzutowania, które powodują odwołania rvalue do typów innych niż funkcje jako typy rvalue. Domyślnie lub jeśli /Zc:rvalueCast-
jest określony, kompilator jest niezgodny i traktuje wszystkie wyrażenia rzutowania, które powodują odwołania rvalue jako wartości rvalue. Aby zapewnić zgodność i wyeliminować błędy podczas używania rzutów, zalecamy użycie polecenia /Zc:rvalueCast
.
Domyślnie /Zc:rvalueCast
jest wyłączone (/Zc:rvalueCast-
). /permissive- opcja kompilatora niejawnie ustawia tę opcję, ale można ją zastąpić za pomocą polecenia /Zc:rvalueCast-
.
Użyj polecenia /Zc:rvalueCast
, jeśli przekazujesz wyrażenie rzutowania jako argument do funkcji, która przyjmuje typ odwołania rvalue. Domyślne zachowanie powoduje błąd kompilatora C2664 , gdy kompilator niepoprawnie określa typ wyrażenia rzutowania. W tym przykładzie pokazano błąd kompilatora w poprawnym kodzie, jeśli /Zc:rvalueCast
nie zostanie określony:
// 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ślne zachowanie kompilatora może nie zgłaszać błędu C2102, jeśli jest to konieczne. W tym przykładzie kompilator nie zgłasza błędu, jeśli adres rvalue utworzonej przez rzutowanie tożsamości jest pobierany, gdy /Zc:rvalueCast
jest nieokreślony:
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 na temat problemów ze zgodnością w programie Visual C++, zobacz Zachowanie niezgodne.
Aby ustawić tę opcję kompilatora w środowisku programowania Visual Studio
Otwórz okno dialogowe Strony właściwości projektu. Aby uzyskać szczegółowe informacje, zobacz Set C++ compiler and build properties in Visual Studio (Ustawianie właściwości kompilatora języka C++ i kompilowania w programie Visual Studio).
Wybierz stronę właściwości Właściwości>konfiguracji C/C++>Language.
Ustaw właściwość Wymuszaj reguły konwersji typów na
/Zc:rvalueCast
lub/Zc:rvalueCast-
. Wybierz przycisk OK lub Zastosuj , aby zapisać zmiany.