/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
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.
Sélectionnez la page de propriétés C/C++>Language des propriétés>de configuration.
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
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour