我有一个具有(公共)函数返回向量的类(但它似乎无关紧要)。
std::vector<int> test() {
return std::vector<int>(1,0);
}
为什么我可以像 void 函数一样调用它,
test();
没有得到编译错误,或者至少没有警告(Wall,pedantic)?
我有一个具有(公共)函数返回向量的类(但它似乎无关紧要)。
std::vector<int> test() {
return std::vector<int>(1,0);
}
为什么我可以像 void 函数一样调用它,
test();
没有得到编译错误,或者至少没有警告(Wall,pedantic)?
您可以丢弃返回值。一般来说,这不是很好的风格,但你总是可以做到的。
这就是我们不能重载返回类型的原因之一。因此,如果您定义另一个 function void test()
,则由于模棱两可而无法进行调用。
如果您希望编译器警告您(非)有意丢弃返回值的情况,请传递标志-Wunused-result
(用于 GCC)。[我不知道其他编译器的标志]
一般来说,几乎所有的返回值都是有意义的,所以有些人使用这个宏来检测他们无意丢弃值的情况,特别是如果返回值类似于错误代码,应该事后检查。
如果要为特定功能启用警告,可以在签名末尾添加一个属性(对于 GCC,对于 MSVC,请查看此问题):
std::vector<int> __attribute__((warn_unused_result)) test() {
return std::vector<int>(1,0);
}
另请参阅:如果忽略返回值,如何发出警告?
因此,如果您调用函数但不使用返回值,则会收到警告。请注意,警告不会使编译失败,为此您需要添加-Werror
到编译器标志。
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.
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.