Autoriser la liaison de référence non-const à Rvalue : une anomalie VS2010
La norme C interdit strictement la liaison de références non-const à des rvalues. Cependant, dans une anomalie particulière, Visual Studio 2010 (SP1) compile le code suivant sans aucune erreur ni avertissement :
string foo() { return "hello"; }
int main() {
string& tem = foo(); // Non-const reference to rvalue
}
Différences de comportement du compilateur
À l'opposé, d'autres compilateurs présentent un comportement plus strict :
Explication de l'anomalie VS2010
Ce comportement inhabituel dans VS2010 provient d'une extension connue du compilateur. Contrairement à GCC et Visual Studio 2008, VS2010 permet aux références non const d'être liées à des rvalues dans certains cas, par exemple lorsque la rvalue est générée par une fonction renvoyant un objet temporaire.
Bien que cette extension défie la norme, il a probablement été mis en œuvre par commodité. Cependant, cela peut conduire à un comportement indéfini si la valeur r est modifiée après que la référence soit liée.
Conséquences et recommandations
Cette extension peut introduire des bugs subtils dans le code qui s'appuie sur sur le bon respect de la norme C. Par conséquent, il est fortement recommandé d'éviter de lier des références non const à des rvalues, même dans VS2010. Au lieu de cela, utilisez toujours des références const lors de la liaison à des rvalues, comme prévu par la norme.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3