假设我有以下代码:
std::vector<T> R;
if (condition) R = generate();
...
for (int i = 0; i < N; ++i) {
const auto &r = (R.empty() ? generate() : R);
}
无论R.empty()
如何,都会调用generate。这是标准行为吗?
答案 0 :(得分:15)
来自C ++ 11标准的第5.16 / 1段:
条件表达式从右到左分组。第一个表达式在上下文中转换为bool(第4条)。它被评估,如果是,则条件表达式的结果是第二个表达式的值,否则是第三个表达式的值。 仅评估第二个和第三个表达式中的一个。在与第二个或第三个表达式相关的每个值计算和副作用之前,对与第一个表达式相关的每个值计算和副作用进行排序。