为什么在c++中可以将非void成员函数调用为void成员函数
return value - why can I call a non-void member function as a void one in c++?
我有一个(公共)函数返回一个向量的类(但它似乎是无关紧要的)。
std::vector<int> test() {
return std::vector<int>(1,0);
}
为什么我可以像调用void函数一样调用它,
test();
没有得到一个编译错误,或者至少一个警告(墙,迂腐)?
可以丢弃返回值。一般来说,这不是一个好的风格,但你总是可以这样做。
这就是不能重载返回类型的原因之一。因此,如果您定义另一个函数void test()
,则由于歧义,该调用将不可能。
如果你想让你的编译器警告你故意丢弃返回值的情况,传递标志-Wunused-result
(用于GCC)。[我不知道其他编译器的标志]
一般来说,几乎所有的返回值都是有意义的,所以有些人使用这个宏来检测他们无意中丢弃值的情况,特别是当返回值类似于错误代码时,应该稍后检查。
如果您想为特定函数启用警告,您可以在签名的末尾放置一个属性(对于GCC,对于MSVC也可以查看这个问题):
std::vector<int> __attribute__((warn_unused_result)) test() {
return std::vector<int>(1,0);
}
参见:如果返回值被忽略,如何引发警告?
因此,如果调用函数但不使用返回值,则会得到警告。注意,警告不会使编译失败,为此,您需要将-Werror
添加到编译器标志中。
尝试将void函数的返回值赋给变量是错误的(因为没有返回值),但丢弃实际的返回值不是错误。这是因为函数调用可能仍然有副作用,并且可能返回值只是提供信息(例如,当您总是期望成功时,状态码)。由于这样的情况,语言设计者认为在c++中调用非void函数而不捕获返回值是可以的。
因为编译器直接丢弃返回值。可能是编译器的警告选项,但默认情况下没有启用
相关文章:
- C++ - 非静态 void* 成员,指向具有相同地址但不同值的不同对象的另一个非静态成员
- reinterpret_cast指向 void(*&)() 的成员函数指针
- 为什么全局函数 void showA(A&x) 能够访问 A 类的私有成员?
- 访问由 void 指针引用的结构的成员
- registerPointPickingCallback (PCLViewer::callback_Test,(void*)&viewer);返回 C3687 非标准语法;使用"&"创建指向成员的指针
- void降低();成员函数减少分数
- 如何转换 void* 以访问结构的静态数据成员?
- 函数成员中用于void和继承的enable_if
- enable_if:没有参数的 void 成员函数的最小示例
- 错误:无法在没有对象的情况下调用成员函数'void Fortest::run()'|
- ASIO UDP:类 std::分配器<void>没有名为"construct"的成员
- 不能在没有对象的情况下调用成员函数'virtual void ThreadBase::doTask()'
- 类 'StringSet' 中未声明'void StringSet::removeALL()'成员函数
- Constexpr类模板成员函数是否具有推导的void返回类型
- 错误 C2535:"void NumberList::appendNode(double)":成员函数已定义或声明 第 35 行
- 如何函数<void(字符串消息)>绑定到成员函数?
- 将指向成员函数的指针作为void*函数的参数传递
- 传递接受 void * 的成员函数
- 访问对象 void 指针 c++ 的成员
- 指向成员函数的指针映射:无法将 void (*) 转换为 void (对象::*)