不存储成员函数c ++的返回值是不好的做法

时间:2018-04-05 01:12:58

标签: c++ c++11

假设我有一个返回整数的成员函数,在奇数情况下调用成员函数并且不存储返回值会被认为是不好的做法。

修改

这样的一个例子是将一个项附加到一个向量并返回附加项的索引的函数。

一个简化的例子。

#include <vector>

using namespace std;

vector<int> myVector; 

int AppendVector(int value)
{
    myVector.push_back(value);
}

int main()
{
    AppendVector(3);
    AppendVector(4);

    int indexOfValue = AppendVector(2);
    // do action on appended value 
}

2 个答案:

答案 0 :(得分:9)

不,这种情况很常见。有许多函数经常使用而忽略了返回值。

您可能使用或看过的一些示例:

  • std::printf,返回写入的字符数。
  • operator<<返回流,最终被丢弃
  • std::vector::erase在最后一个元素删除后返回一个迭代器
  • std::map::insert返回迭代器和状态

对于返回值特别重要的情况,C ++ 17添加了[[nodiscard]] attribute

Pro ++ to C ++ 17你必须使用特定于编译器的东西,例如gcc的__attribute__((warn_unused_result))。有关详细信息,请参阅this answer

答案 1 :(得分:2)

它将完全依赖于返回值的含义,以及调用者通过方法调用尝试完成的操作。

编写调用代码的人肯定应该考虑他想要对返回值做什么(如果有的话);一个常见的新手错误是忽略返回值而不是检查它,因此无法采取适当行动,例如如果返回值表明方法的操作失败。

你可能会看到一个半常见的习语:

(void) someObject.Method();

在(无效)前缀没有按&#39;吨做任何事情(编译器会忽略它),但它作为一个指标到人读者,谁写的那行是人的有意的忽略返回值,而不是不理解返回值。它并没有改变程序的行为方式,但它确实让未来的源代码读者不知道他们是在看错还是忽略是故意的。