“Otimização de valor de retorno” causa comportamento indefinido?
-
22-09-2019 - |
Pergunta
Leitura isto Artigo da Wikipedia apontado por um dos repetições para a seguinte pergunta:
Construtor de cópia C ++, temporários e semântica de copiar
Eu me deparei com esta linha
Dependendo do compilador e das configurações do compilador, o programa resultante pode exibir qualquer uma das seguintes saídas:
Isso não se qualifica para o comportamento indefinido? Eu sei que o artigo diz Depending on the compiler and settings
Mas eu só quero limpar isso.
Solução
Não, não é um comportamento indefinido. O comportamento indefinido possui uma definição específica no padrão (principalmente: "comportamento, como pode surgir após o uso de uma construção errônea do programa ou dados errôneos, para os quais esse padrão internacional não impõe requisitos.") Nesse caso, o comportamento não é especificado, mas não indefinido.
A diferença é que qualquer execução de qualquer coisa com comportamento indefinido torna todo o comportamento do seu programa indefinido (ou seja, tudo pode acontecer). Com esse comportamento não especificado em particular, apenas uma das duas coisas pode acontecer: ou o construtor de cópias é executado ou não.
Outras dicas
Não. O comportamento é definido como uma das saídas da lista. O comportamento indefinido inclui demônios voando para fora do seu nariz.
Ver: Demônios nasais
comportamento indefinido é bem diferente de implementação comportamento definido, que é o que está envolvido aqui.
Depende do que você quer dizer com indefinido. Acredito que os outros disseram aqui - pela definição que o documento de padrões usa. Mas também sei que quando alguém diz "isso ou aquilo, não estou lhe dizendo qual" penso nisso como comportamento indefinido.
Porém, não é grande coisa, pois nunca deve causar um erro. Quando você define certos métodos, espera -se que você os defina seguindo convenções específicas - é um tipo de contrato implícito entre você, o compilador e as pessoas que usarão e manterão seu código.
Nesse caso, se você obtém uma constituição de cópia etc ou o comportamento otimizado, espera -se que o efeito seja o mesmo - o chamador recebe o valor desejado. Se o seu construtor de cópias estiver imprimindo "Hello World!" Ou possui outros efeitos colaterais inadequados, ele não está implementando o comportamento esperado para um construtor; portanto, a falha é sua por quebrar o contrato.