If-C++中带有空体的语句:是否保证要评估条件?

phi*_*ipp 8 c++

鉴于此声明(作为旁注,不是我首选的编码风格)

if( doSomething() ) {}
Run Code Online (Sandbox Code Playgroud)

"C++标准"是否保证调用该函数?(它的返回值对执行路径没有影响,因此编译器可以遵循快捷方式评估的思想并对其进行优化.)

cad*_*luk 8

没有涉及短路操作器,因此如果在不消除副作用的情况下无法优化,则可以保证调用该功能.引用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.