我有一种情况,我有两个不同的函数签名,它们的返回类型不同。
调用函数时,返回类型被忽略,因此它是
void
返回类型。
调用非void返回函数时是否有任何未定义的行为?
以下示例作为参考(链接运行):
#include <iostream>
#include <functional>
std::function<void(void)> f;
int main()
{
f = []() -> int { std::cout << "Returning int\n"; return 0; };
f(); // No registering of return type, is it UB at any circumstance?
return 0;
}
忽略返回结果是明确允许的。
您正在使用
template< class F > function& operator=( F&& f );
的 operator=
重载,它有以下要求:
此运算符不参与重载解析,除非对于参数类型
和返回类型f
Args...
,R
是 Callable。
哪个是
在未评估的上下文中格式良好。INVOKE<R>(f, std::declval<ArgTypes>()...)
仅展示操作
定义如下:INVOKE<R>(f, arg_0, arg_1, arg_2, ..., arg_N)
如果
(可能符合简历资格)R
void
static_cast<void>(INVOKE(f, arg_0, arg_1, arg_2, ..., arg_N)).
即它通过转换为
void
显式丢弃结果
这是有效的代码,返回将被简单地丢弃。
但是,很难通过快速检查判断这是有意还是疏忽。
使用
std::ignore
等工具澄清这是您的意图将有助于提高代码的可读性
auto g = []() -> int { std::cout << "Returning int\n"; return 0; };
f = [&g]() -> void{ std::ignore = g(); };
//use g somewhere else or refactor to eliminate g