Maison  >  Article  >  développement back-end  >  Pourquoi VS2010 permet-il de lier des références non const à des valeurs R ?

Pourquoi VS2010 permet-il de lier des références non const à des valeurs R ?

DDD
DDDoriginal
2024-10-28 03:22:31631parcourir

Why Does VS2010 Allow Non-Const References to be Bound to Rvalues?

Liaison de référence non const à Rvalue : une anomalie VS2010

En C , la liaison d'une référence non const à une rvalue est généralement considérée une erreur. Cependant, dans Visual Studio 2010, le code suivant se compile sans aucune erreur ni avertissement :

<code class="cpp">string foo() { return "hello"; }
int main() 
{
    //below should be illegal for binding a non-const (lvalue) reference to a rvalue
    string& tem  = foo();   

    //below should be the correct one as only const reference can be bind to rvalue(most important const)
    const string& constTem = foo();   
}</code>

Ce comportement est incohérent avec d'autres compilateurs comme GCC et VS2008, qui génèrent des erreurs de compilation ou des avertissements pour un tel code. Cette divergence a soulevé des questions quant à savoir s'il s'agit d'un bug dans VS2010.

Explication

Le comportement de VS2010 dans ce cas est attribué à une extension connue dans les compilateurs VS . Historiquement, ces compilateurs ont permis que des références non const soient liées à des rvalues ​​sans qualification explicite de const. Ce comportement a été introduit pour faciliter la tâche des programmeurs et n'est pas considéré comme une fonctionnalité standard du C.

Dans l'exemple de code, l'absence d'erreurs ou d'avertissements dans VS2010 peut être expliquée comme suit :

  • Le compilateur reconnaît la valeur de retour de foo() comme une valeur r.
  • Il interprète la déclaration string& tem comme une référence non const à une chaîne.
  • Cependant, en raison de la extension dans les compilateurs VS, elle permet à la référence d'être liée à la rvalue renvoyée par foo().

Conclusion

Le comportement de VS2010 en autorisant les références non const à lier à des rvalues ​​sans erreurs ni avertissements ne sont pas la norme C et sont considérées comme une extension. Bien que cela puisse être utile dans certains cas, cela peut également conduire à un comportement inattendu et est généralement déconseillé en faveur de l'utilisation de références const pour la liaison aux rvalues.

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