能否将返回类型不同的可调用对象赋值给std::function?是否有未定义行为?
将返回非void的可调用对象存入
std::function<void()>是否存在未定义行为? 问题描述
我希望将一个可调用对象存储在std::function中,调用该存储的对象时不关心其返回值,因此将std::function的返回类型设为void。请问调用该存储的函数时是否存在未定义行为?以下面的代码为例,其中lambda表达式返回int类型:
#include <iostream> #include <functional> std::function<void(void)> f; int main() { f = []() -> int { std::cout << "Returning int\n"; return 0; }; f(); // 这里是否存在未定义行为? return 0; }
该问题同样适用于任何可调用对象,例如成员函数、自由函数等。
回答
这种用法不存在未定义行为,是完全合法的。
根据C++标准的规定,当std::function<R(Args...)>存储一个返回类型为R2的可调用对象时,若R是void,则任何返回类型的可调用对象都可以被适配——调用std::function时会自动忽略存储对象的返回值,不会触发未定义行为。
简单来说:
- 不管你存储的是返回
int、float的自由函数,还是返回自定义类型的成员函数、lambda表达式,只要std::function的返回类型是void,调用它时都会安全地忽略返回值,程序行为完全符合预期。
你提供的代码示例运行时会正常输出Returning int,没有任何问题。
内容的提问来源于stack exchange,提问作者Hamza Hajeir
相关产品推荐
相关产品推荐

