Maison >développement back-end >C++ >Pourquoi Visual Studio autorise-t-il les références non-Const à se lier à des objets temporaires alors que GCC ne le fait pas ?

Pourquoi Visual Studio autorise-t-il les références non-Const à se lier à des objets temporaires alors que GCC ne le fait pas ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-22 19:58:10764parcourir

Why Does Visual Studio Allow Non-Const References to Bind to Temporary Objects While GCC Doesn't?

Erreur : référence non const liée à un objet temporaire dans Visual Studio

GCC génère une erreur lors de l'affectation d'un objet temporaire à un objet non const référence. Étonnamment, Visual Studio le permet. Pourquoi cet écart ?

L'explication réside dans une ancienne extension de Visual Studio. Comme indiqué dans un rapport de bogue : « Les objets temporaires peuvent être liés à des références non constantes », Visual Studio permet aux objets temporaires d'être liés à des références non constantes, même si cela peut entraîner un comportement non défini.

Ceci le comportement a été controversé. Une réponse au rapport de bug indique qu'il existe un avertissement de niveau 4 pour cette erreur, qui peut être activé avec l'indicateur du compilateur "/W4".

Cependant, il existe un moyen d'en faire une erreur dans Visual Studio : désactivez les extensions de langue avec le flag "/Za". Il s'agit d'une solution de contournement utile si vous souhaitez respecter les normes C strictes et éviter un comportement de code potentiellement problématique.

Pour illustrer, considérons l'exemple suivant :

class Zebra { int x; };
Zebra goo() { Zebra z; return z; }
void foo(Zebra &x)
{
    Zebra y;
    x = y;
    foo(goo()); // Error in GCC, allowed in Visual Studio
}

Dans Visual Studio, ce code compilera sans erreurs. Cependant, dans GCC, cela générera une erreur de compilation en raison de l'affectation de l'objet temporaire à une référence non const.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn