“as if” in language standards

后端 未结 3 1791
旧时难觅i
旧时难觅i 2020-12-18 22:15

What is the exact meaning of the phrase \"as if\" in the standard and how does it work when a user can modify individual parts of the behavior.

The question is in re

3条回答
  •  粉色の甜心
    2020-12-18 23:10

    From 1.9 "Program execution:

    conforming implementations are required to emulate (only) the observable behavior of the abstract machine

    and in an informational footnote:

    This provision is sometimes called the “as-if” rule, because an implementation is free to disregard any requirement of this International Standard as long as the result is as if the requirement had been obeyed, as far as can be determined from the observable behavior of the program. For instance, an actual implementation need not evaluate part of an expression if it can deduce that its value is not used and that no side effects affecting the observable behavior of the program are produced.

    The standard does specifically note that the "as-if" requirement is binding on a replacement version of the nothrow version of operator new(). However, as I read it, that requirement would fall to the programmer overriding operator new() not the compiler. The flip side of this responsibility is that I think the standard pretty much requires the default implementation of the nothrow operator new() provided by the library must do something along the lines of calling the throwing new in a try/catch and return 0 if std::bad_alloc is caught.

    Where the "as if rule" could come in to play here is if the compiler/linker/whatever were smart enough to figure out that when the default throwing new() was in being used, the default non-throwing new() could take the shortcut, but if the default throwing new() was overridden, the default non-throwing new() would have to act differently. I'm sure this is technically possible for an implementation (even if you probably can't express it in standard C++). I'd be surprised if there was ever an implementation that did this.

    I might be reading too much into the requirement, but I think that's what can be inferred.

提交回复
热议问题