/Zc:rvalueCast (Wymuszanie zasad konwersji typów)

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

  1. 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).

  2. Wybierz stronę właściwości Właściwości>konfiguracji C/C++>Language.

  3. Ustaw właściwość Wymuszaj reguły konwersji typów na /Zc:rvalueCast lub /Zc:rvalueCast-. Wybierz przycisk OK lub Zastosuj , aby zapisać zmiany.

Zobacz też

/Zc (Zgodność)