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

Mar*_*sne 0 c++ return-value

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

std::vector<int> test() {
return std::vector<int>(1,0);
}
Run Code Online (Sandbox Code Playgroud)

为什么我被允许称它为虚函数,

test();
Run Code Online (Sandbox Code Playgroud)

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

lee*_*mes 6

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

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

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

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

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

std::vector<int> __attribute__((warn_unused_result)) test() {
    return std::vector<int>(1,0);
}
Run Code Online (Sandbox Code Playgroud)

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

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