为什么在c++中可以将非void成员函数调用为void成员函数

return value - why can I call a non-void member function as a void one in c++?

本文关键字:成员 void 函数调用 函数 c++ 为什么      更新时间:2023-10-16

我有一个(公共)函数返回一个向量的类(但它似乎是无关紧要的)。

std::vector<int> test() {
return std::vector<int>(1,0);
}

为什么我可以像调用void函数一样调用它,

test();

没有得到一个编译错误,或者至少一个警告(墙,迂腐)?

可以丢弃返回值。一般来说,这不是一个好的风格,但你总是可以这样做。

这就是不能重载返回类型的原因之一。因此,如果您定义另一个函数void test(),则由于歧义,该调用将不可能。

如果你想让你的编译器警告你故意丢弃返回值的情况,传递标志-Wunused-result(用于GCC)。[我不知道其他编译器的标志]

一般来说,几乎所有的返回值都是有意义的,所以有些人使用这个宏来检测他们无意中丢弃值的情况,特别是当返回值类似于错误代码时,应该稍后检查。

如果您想为特定函数启用警告,您可以在签名的末尾放置一个属性(对于GCC,对于MSVC也可以查看这个问题):

std::vector<int> __attribute__((warn_unused_result)) test() {
    return std::vector<int>(1,0);
}

参见:如果返回值被忽略,如何引发警告?

因此,如果调用函数但不使用返回值,则会得到警告。注意,警告不会使编译失败,为此,您需要将-Werror添加到编译器标志中。

尝试将void函数的返回值赋给变量是错误的(因为没有返回值),但丢弃实际的返回值不是错误。这是因为函数调用可能仍然有副作用,并且可能返回值只是提供信息(例如,当您总是期望成功时,状态码)。由于这样的情况,语言设计者认为在c++中调用非void函数而不捕获返回值是可以的。

因为编译器直接丢弃返回值。可能是编译器的警告选项,但默认情况下没有启用