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

时间:2015-10-22 09:10:41

标签: c++

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

if( doSomething() ) {}

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

1 个答案:

答案 0 :(得分:8)

没有涉及短路操作器,因此如果在不消除副作用的情况下无法优化,则可以保证调用该功能。引用C ++ 11标准:

  符合。[...]符合   如下所述,实现需要模拟(仅)抽象机器的可观察行为   下方。 5

     

5 此条款有时被称为“as-if”规则[...]实际实现不需要评估表达式的一部分   如果它可以推断出它的价值没有被使用并且没有副作用   影响了程序的可观察行为。

所以,像

int doSomething() { return 1; }

可能会被优化掉,但

int doSomething() { std::cout << "d\n"; return 1; }

是不允许的。

此外,从C ++ 11开始,您可以编写更复杂的函数,并且仍然可以使用constexpr在编译时对它们进行评估。