/Zc:rvalueCast (Applicare regole di conversione dei tipi)

Quando si specifica l'opzione /Zc:rvalueCast , il compilatore identifica correttamente un tipo di riferimento rvalue come risultato di un'operazione di cast. Il comportamento è conforme allo standard C++11. Quando l'opzione non è specificata, il comportamento del compilatore è identico a quello di Visual Studio 2012.

Sintassi

/Zc:rvalueCast
/Zc:rvalueCast-

Osservazioni:

Se /Zc:rvalueCast viene specificato, il compilatore segue la sezione 5.4 dello standard C++11 e considera solo le espressioni cast che generano tipi non di riferimento ed espressioni di cast che generano riferimenti rvalue a tipi non funzione come tipi rvalue. Per impostazione predefinita, o se /Zc:rvalueCast- viene specificato, il compilatore non è conforme e considera tutte le espressioni cast che generano riferimenti rvalue come rvalue. Per la conformità e per eliminare gli errori nell'uso dei cast, è consigliabile usare /Zc:rvalueCast.

Per impostazione predefinita, /Zc:rvalueCast è disattivato (/Zc:rvalueCast-). L'opzione del compilatore /permissive- imposta in modo implicito questa opzione, ma può essere sottoposta a override tramite /Zc:rvalueCast-.

Utilizzare /Zc:rvalueCast se si passa un'espressione cast come argomento a una funzione che accetta un tipo di riferimento rvalue. Il comportamento predefinito causa l'errore del compilatore C2664 quando il compilatore determina erroneamente il tipo dell'espressione cast. Questo esempio mostra un errore del compilatore nel codice corretto quando /Zc:rvalueCast non viene specificato:

// 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));
   }
};

È possibile che il comportamento predefinito del compilatore non segnali l'errore C2102 quando appropriato. In questo esempio il compilatore non segnala un errore se l'indirizzo di un rvalue creato da un cast di identità viene eseguito quando /Zc:rvalueCast non viene specificato:

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
}

Per altre informazioni sui problemi di conformità in Visual C++, vedere Nonstandard Behavior.

Per impostare l'opzione del compilatore nell'ambiente di sviluppo di Visual Studio

  1. Aprire la finestra di dialogo Pagine delle proprietà del progetto. Per informazioni dettagliate, vedere Impostare il compilatore e le proprietà di compilazione.

  2. Selezionare la pagina delle proprietà Proprietà>di configurazione C/C++>Language.

  3. Impostare la proprietà Imponi regole di conversione dei tipi su /Zc:rvalueCast o /Zc:rvalueCast-. Scegliere OK o Applica per salvare le modifiche.

Vedi anche

/Zc (conformità)