You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将返回类型不同的可调用对象赋值给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 18:33:09