【问题标题】:Is it considered bad practise to not store the return value from a member function c++不存储成员函数c ++的返回值是否被认为是不好的做法
【发布时间】:2018-04-05 01:12:58
【问题描述】:

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

编辑。

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

一个简化的例子。

#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 
}

【问题讨论】:

  • 一点也不。例如。 T::operator= 通常会返回 T&amp;,但实际使用此返回值的情况很少见。
  • 在很多情况下,您都希望忽略返回,即使返回表明函数成功或失败
  • 为什么返回一个整数?
  • 你存储printf的返回值吗?

标签: c++ c++11


【解决方案1】:

不,这样做很常见。有很多函数经常使用而忽略返回值。

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

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

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

在 C++17 之前,您必须使用特定于编译器的东西,例如 gcc 的 __attribute__((warn_unused_result))。详情请参阅this answer

【讨论】:

    【解决方案2】:

    这将完全取决于返回值的含义,以及调用者试图通过方法调用来完成什么。

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

    您可能会看到一个半常见的成语:

    (void) someObject.Method();
    

    (void) 前缀没有任何作用(编译器会忽略它),但它确实向人类读者表明编写该行的人故意忽略了返回值,而不是无法理解返回的值。它不会改变程序的行为方式,但它确实让未来的源代码读者不会怀疑他们是否正在查看错误或是否有意忽略。

    【讨论】:

    • "(编译器会忽略它"。它会使用它在[[nodiscard]]属性的情况下不发出警告。Demo
    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 2019-06-08
    • 1970-01-01
    • 2014-04-20
    • 2013-12-08
    • 1970-01-01
    相关资源
    最近更新 更多