鉴于此声明(作为旁注,不是我首选的编码风格)
if( doSomething() ) {}
Run Code Online (Sandbox Code Playgroud)
"C++标准"是否保证调用该函数?(它的返回值对执行路径没有影响,因此编译器可以遵循快捷方式评估的思想并对其进行优化.)
没有涉及短路操作器,因此如果在不消除副作用的情况下无法优化,则可以保证调用该功能.引用C++ 11标准:
[...]符合要求的实现需要模拟(仅)抽象机器的可观察行为,如下所述.五
5 这个条款有时被称为"as-if"规则[...]实际实现不需要评估表达式的一部分,如果它可以推断出它的值没有被使用,并且没有副作用影响程序的可观察行为生产.
所以,像
int doSomething() { return 1; }
Run Code Online (Sandbox Code Playgroud)
可能会被优化掉,但是
int doSomething() { std::cout << "d\n"; return 1; }
Run Code Online (Sandbox Code Playgroud)
是不允许的.
此外,从C++ 11开始,您可以编写更复杂的函数,并且仍然可以在编译时使用它们进行评估constexpr.