0

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

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

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

test();

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

4

3 回答 3

6

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

这就是我们不能重载返回类型的原因之一。因此,如果您定义另一个 function void test(),则由于模棱两可而无法进行调用。

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

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

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

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

另请参阅:如果忽略返回值,如何发出警告?

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

于 2013-01-08T13:40:16.030 回答
0

Because the compiler simply discards the return value. There may be options to your compiler that warn about this, but it's not enabled by default.

于 2013-01-08T13:40:16.543 回答
0

It is an error to try to assign a void function return value to a variable (since there is no return value), but it is not an error to discard an actual return value. This is because the function call may still have a side effect, and perhaps the return value is only informative (e.g., a status code, when you're always expecting success). Because of scenarios like that, the language designers decided it is okay in C++ to call a non-void function without capturing the return value.

于 2013-01-08T13:43:17.760 回答