C ++中的延迟返回值

时间:2013-07-14 10:03:59

标签: c++

今天我在C ++代码中犯了一个有趣的错误。我有一个函数有两个类型std::vector<int>::iterator&ij)的参数。迭代器应指向相同的向量。函数应返回向量中两个数字的总和,并将两个迭代器向前移动到向量的第j + 1位:

int exp_func_add::evaluate(vector<int>::iterator& i, vector<int>::iterator& j) {
    int result = *i + *j;
    ++j;
    i = j;
    return result;
}

首先我写了这段代码:

int exp_func_add::evaluate(vector<int>::iterator& i, vector<int>::iterator& j) {
    ++j;
    i = j;
    return (*i+*j); // <====== Oops !
}

我们知道return语句会将控制权返回给调用者。我的问题是为什么C ++标准没有定义后期值返回语义?我们称之为late_return关键字:

int exp_func_add::evaluate(vector<int>::iterator& i, vector<int>::iterator& j) {
    late_return *i+*j; // Hold return value but don't go back 
                       // to the caller until leaving scope
    ++j;
    i = j;
}

这个问题可能会得到数百个downvotes(不是建设性的,等等)。虽然我想问一些问题:

  1. 有没有办法使用宏或任何其他技巧来模拟这种行为?
  2. 这是否值得实施或被视为下一个c ++标准中的一项功能?
  3. 是否有编程语言实现类似功能?

3 个答案:

答案 0 :(得分:3)

  • 有没有办法使用宏或任何其他技巧来模拟这种行为?

不是真的,虽然您的第一个代码示例是相当惯用的C或C ++代码。“将值赋给”result“,然后”返回结果“,因为函数的最后一个语句是非常常见的模式。

  • 这是否值得实施或被视为下一个c ++标准中的一项功能?

不,因为它增加了复杂性而没有任何明显的好处超过现有的习语。它也为语言添加了一大堆边缘情况。函数可以有多个return语句,那么如何处理多个late_return语句呢?第一个获胜?最后一个获胜?抛出异常?包含late_return和return的代码路径怎么样?

  • 是否有编程语言实现类似功能?

我能想到的最接近的是约束语言或像Prolog这样的逻辑语言,只要提供了生成它所需的所有数据,就会产生“结果”。

答案 1 :(得分:2)

  

有没有办法使用宏或任何其他技巧来模拟这种行为?

是的,你自己说过:定义一个名为ret的变量并在结尾处返回它。这只是一行,当你到达函数结束时,它会更加清晰。

答案 2 :(得分:1)

如果我正确理解了这个问题,你基本上是想做这样的事情:

return *i + *(++j, i=j, j-1);

问题在于,当我们到达时, i 可能已经改变了。它不一定(赢得&#t;)从左到右评估这个陈述。

正如其他海报所提到的,除了保存一两行代码之外,这并没有为语言提供任何额外的好处。话虽如此,听起来像是你想要像反向 comma operator这样的东西。

它不存在,但这个想法已经提出herehere

总而言之,我认为它在不需要的情况下增加了显着的复杂性。我不认为这是一个糟糕的问题,因为尝试更好地了解事情是如何工作的,总是好的。我不认为这个特殊用例需要保证。