【问题标题】:C++, ternary operator operand evaluation rulesC++,三元运算符操作数求值规则
【发布时间】:2013-02-07 23:26:38
【问题描述】:

假设我有以下代码:

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。这是标准行为吗?

【问题讨论】:

  • 不,这不是标准行为。你 100% 肯定这是怎么回事吗?比如,你已经运行了一个调试器,你可以看到它正在检查R.empty(),而你正在看着它调用generate()
  • @templatetypedef 是的,绝对确定,三重检查
  • 您能否发布一个最小的、完整的、独立的、可重现的测试用例,以便我们可以使用它?如果R.empty() 为假,则不应调用generate(),因此我怀疑问题出在其他地方。
  • 在我看来,您的代码调用可能会在循环外调用generate()。这可能是你观察到的吗?
  • @Anycorn: show me

标签: c++


【解决方案1】:

来自 C++ 11 标准的第 5.16/1 段:

条件表达式从右到左分组。第一个表达式根据上下文转换为 bool(第 4 条)。它被评估,如果为真,则条件表达式的结果是第二个表达式的值,否则是第三个表达式的值。 只计算第二个和第三个表达式中的一个。与第一个表达式关联的每个值计算和副作用都在与第二个或第三个表达式关联的每个值计算和副作用之前排序。

【讨论】:

    猜你喜欢
    • 2012-04-02
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 2020-08-16
    • 2013-01-15
    • 1970-01-01
    相关资源
    最近更新 更多