"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que o Visual Studio 2010 permite vinculação de referência não Const a Rvalues?

Por que o Visual Studio 2010 permite vinculação de referência não Const a Rvalues?

Publicado em 2024-11-04
Navegar:545

Why Does Visual Studio 2010 Allow Non-Const Reference Binding to Rvalues?

Permitindo vinculação de referência não const a Rvalue: uma anomalia do VS2010

O padrão C proíbe estritamente a vinculação de referências não const a rvalues. No entanto, em uma anomalia peculiar, o Visual Studio 2010 (SP1) compila o seguinte código sem erros ou avisos:

string foo() { return "hello"; }
int main() {
    string& tem = foo(); // Non-const reference to rvalue
}

Discrepâncias de comportamento do compilador

Em contraste, outros compiladores exibem um comportamento mais rigoroso:

  • O GCC emite um erro de compilação, identificando corretamente o ilegal vinculação de uma referência não const a um rvalue.
  • O Visual Studio 2008 fornece um aviso de compilação, reconhecendo o possível problema, mas permitindo que a compilação continue.

Explicação da anomalia do VS2010

Esse comportamento incomum no VS2010 decorre de uma extensão de compilador conhecida. Ao contrário do GCC e do Visual Studio 2008, o VS2010 permite que referências não const sejam vinculadas a rvalues ​​em certos casos, como quando o rvalue é gerado por uma função que retorna um objeto temporário.

Embora esta extensão desafie o padrão, provavelmente foi implementado por conveniência. No entanto, pode levar a um comportamento indefinido se o rvalue for modificado após a referência ser vinculada.

Consequências e recomendações

Esta extensão pode introduzir bugs sutis no código que depende na adesão adequada ao padrão C. Portanto, é altamente recomendável evitar vincular referências não const a rvalues, mesmo no VS2010. Em vez disso, sempre use referências const ao vincular a rvalues, conforme pretendido pelo padrão.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3