为什么我可以在c ++中将非void成员函数称为void void函数?

时间:2013-01-08 13:38:14

标签: c++ return-value

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

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

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

test();

没有收到编译错误,或者至少有警告(Wall,pedantic)?

3 个答案:

答案 0 :(得分:6)

您可以放弃返回值。一般来说这不是好风格,但你总是可以做到。

这就是为什么我们不能在返回类型上重载的原因之一。因此,如果您定义了另一个函数void test(),则由于含糊不清,无法进行调用。

如果您希望编译器警告您(非)故意丢弃返回值的情况,请传递标记-Wunused-result(对于GCC)。 [我不知道其他编译器的标志]

通常,几乎所有返回值都有意义,因此有些人使用此宏来检测他们无意中丢弃该值的情况,特别是如果返回值类似于错误代码之后应该检查它。

如果要为特定功能启用警告,可以在签名末尾添加一个属性(对于GCC也是如此,对于MSVC,请查看this question):

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

另请参阅:How to raise warning if return value is disregarded?

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

答案 1 :(得分:0)

因为编译器只是丢弃返回值。 可能是编译器的选项,可以对此发出警告,但默认情况下不会启用它。

答案 2 :(得分:0)

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