O que é " como se regra "?
A regra " como se " basicamente define quais transformações uma implementação pode realizar em um programa C ++ válido. Resumindo, todas as transformações que não afetam o " comportamento observável " de um programa (veja abaixo uma definição precisa) são permitidas.
O objetivo é dar liberdade às implementações para realizar otimizações, desde que o comportamento do programa permaneça compatível com a semântica especificada pelo padrão C ++ em termos de uma máquina abstrata.
Onde o Padrão introduz esta regra?
O C ++ 11 Standard introduz a regra " como se " no Parágrafo 1.9 / 1:
As descrições semânticas neste Padrão Internacional definem uma máquina abstrata não determinística parametrizada. Este Padrão Internacional não impõe requisitos à estrutura de implementações em conformidade. Em particular, eles não precisam copiar ou emular a estrutura da máquina abstrata. Em vez disso, as implementações em conformidade são necessárias para emular (apenas) o comportamento observável da máquina abstrata, conforme explicado abaixo.
Além disso, uma nota de rodapé explicativa adiciona:
Esta disposição é às vezes chamada de regra "como se" , porque uma implementação é livre para desconsiderar qualquer requisito desta Norma, desde que o resultado seja como se o requisito tivesse sido obedecido, tanto quanto pode ser determinado a partir do comportamento observável do programa. Por exemplo, uma implementação real não precisa avaliar parte de uma expressão se puder deduzir que seu valor não é usado e que nenhum efeito colateral que afeta o comportamento observável do programa é produzido.
O que a regra exige exatamente?
O parágrafo 1.9 / 5 especifica ainda:
Uma implementação conforme executando um programa bem formado deve produzir o mesmo comportamento observável que uma das possíveis execuções da instância correspondente da máquina abstrata com o mesmo programa e a mesma entrada . No entanto, se qualquer uma dessas execuções contiver uma operação indefinida, esta Norma Internacional não impõe nenhum requisito à implementação que executa esse programa com aquela entrada (nem mesmo com relação às operações anteriores à primeira operação indefinida).
É importante enfatizar que esta restrição se aplica apenas ao "executar um programa bem formado" e que os resultados possíveis da execução de um programa que contém comportamento indefinido são irrestritos. Isso é explicitado no Parágrafo 1.9 / 4 também:
Certas outras operações são descritas nesta Norma como indefinidas (por exemplo, o efeito de tentar modificar um objeto const). [Nota: Este Padrão Internacional não impõe requisitos sobre o comportamento de programas que contêm comportamento indefinido . —Enviar nota]
Finalmente, com relação à definição de " comportamento observável ", o parágrafo 1.9 / 8 é o seguinte:
Os requisitos mínimos em uma implementação em conformidade são:
- O acesso a objetos voláteis é avaliado estritamente de acordo com as regras da máquina abstrata.
- No encerramento do programa, todos os dados gravados em arquivos devem ser idênticos a um dos resultados possíveis que a execução do programa de acordo com a semântica abstrata teria produzido.
- A dinâmica de entrada e saída de dispositivos interativos deve ocorrer de tal forma que a saída do prompt seja realmente entregue antes que um programa aguarde a entrada. O que constitui um dispositivo interativo é definido pela implementação.
Esses são coletivamente chamados de comportamento observável do programa . [ Nota : Correspondências mais rigorosas entre semântica abstrata e real podem ser definidas por cada implementação. - nota final ]
Existem situações em que esta regra não se aplica?
Até onde sei, a única exceção à regra " como se " é a eliminação de copiar / mover, que é permitida mesmo que o construtor de cópia, o construtor de movimento ou o destruidor de uma classe tenham efeitos colaterais. As condições exatas para isso são especificadas no Parágrafo 12.8 / 31:
Quando certos critérios são atendidos, uma implementação pode omitir a construção copiar / mover de um objeto de classe, mesmo se o construtor selecionado para a operação de copiar / mover e / ou o destruidor do objeto tiver efeitos colaterais . [...]