我有一个以(公共)函数为特色的类返回一个向量(但它似乎无关紧要)。
std::vector<int> test() {
return std::vector<int>(1,0);
}
为什么我可以像空函数一样调用它,
test();
没有收到编译错误,或者至少有警告(Wall,pedantic)?
答案 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函数而不捕获返回值是可以的。