3

今天我在我的 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;
}

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

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

3 回答 3

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

并非如此,尽管您的第一个代码示例是相当惯用的 C 或 C++ 代码。“为“结果”赋值,然后将“返回结果”作为函数的最后一条语句是一种非常常见的模式。

  • 这是否值得实现或被视为下一个 c++ 标准中的一个特性?

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

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

我能想到的最接近的东西是约束语言或逻辑语言,如 Prolog,一旦提供了生成它所需的所有数据,就会生成“结果”。

于 2013-07-14T10:16:00.007 回答
2

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

是的,你自己说过:定义一个名为的变量ret并在最后返回它。这只是多了一行,当你到达函数的末尾时会更清楚发生了什么。

于 2013-07-14T10:09:39.600 回答
1

如果我正确理解了这个问题,那么您实际上是在寻求做这样的事情:

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

问题在于,当我们到达它时,我可能已经改变了。它不一定(不会?)从左到右评估此语句。

正如其他海报所提到的,这实际上并没有为语言提供任何额外的好处,除了可能节省一两行代码。话虽这么说,在我看来,你想要一个 逗号运算符之类的东西。

它不存在,但这个想法已经在这里这里提出来了。

总而言之,我认为它在确实不需要它的情况下增加了显着的复杂性。我不认为这是一个坏问题,因为尝试并更好地理解事物如何/为什么起作用总是好的。我只是不认为这个特定的用例值得。

于 2013-07-14T23:09:14.587 回答