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