/Zc:rvalueCast (Appliquer les règles de conversion de type)

Lorsque l’option /Zc:rvalueCast est spécifiée, le compilateur identifie correctement un type de référence rvalue à la suite d’une opération de cast. Son comportement est conforme à la norme C++11. Lorsque l’option n’est pas spécifiée, le comportement du compilateur est le même que dans Visual Studio 2012.

Syntaxe

/Zc:rvalueCast
/Zc:rvalueCast-

Notes

Si /Zc:rvalueCast elle est spécifiée, le compilateur suit la section 5.4 de la norme C++11 et traite uniquement les expressions de cast qui entraînent des types non références et des expressions de cast qui entraînent des références rvalue à des types non de fonction en tant que types rvalue. Par défaut, ou s’il /Zc:rvalueCast- est spécifié, le compilateur n’est pas conforme et traite toutes les expressions de cast qui entraînent des références rvalue en tant que rvalues. Pour la conformité et pour éliminer les erreurs dans l’utilisation de casts, nous vous recommandons d’utiliser /Zc:rvalueCast.

Par défaut, /Zc:rvalueCast est désactivé (/Zc:rvalueCast-). L’option /permissive- compilateur définit implicitement cette option, mais elle peut être substituée à l’aide /Zc:rvalueCast-de .

Utilisez cette option si vous passez /Zc:rvalueCast une expression de cast en tant qu’argument à une fonction qui accepte un type de référence rvalue. Le comportement par défaut provoque l’erreur du compilateur C2664 lorsque le compilateur détermine incorrectement le type de l’expression de cast. Cet exemple montre une erreur du compilateur dans le code correct quand /Zc:rvalueCast elle n’est pas spécifiée :

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

Le comportement par défaut du compilateur peut ne pas signaler l'erreur C2102 quand cela est nécessaire. Dans cet exemple, le compilateur ne signale pas d’erreur si l’adresse d’une rvalue créée par un cast d’identité est prise lorsqu’elle /Zc:rvalueCast n’est pas spécifiée :

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
}

Pour plus d’informations sur les problèmes de conformité dans Visual C++, consultez Nonstandard Behavior.

Pour définir cette option du compilateur dans l'environnement de développement Visual Studio

  1. Ouvrez la boîte de dialogue Pages de propriété du projet. Pour plus d’informations, consultez Définir le compilateur C++ et les propriétés de build dans Visual Studio.

  2. Sélectionnez la page de propriétés C/C++>Language des propriétés>de configuration.

  3. Définissez la propriété Appliquer les règles de conversion de type sur /Zc:rvalueCast ou /Zc:rvalueCast-. Choisissez OK ou Appliquer pour enregistrer vos modifications.

Voir aussi

/Zc (Conformité)