c++ 使用`std :: function`调用非空函数

前段时间我使用std ::函数很像这样:

std::function<void(int)> func = [](int i) -> int { return i; };

基本上,我这样做是因为我想在std ::函数中存储不同的函数对象,但是我不想限制这些函数的返回类型.既然这样似乎起作用,我就一起去了.但是我不相信它是安全的使用,我还没有找到任何文件.有人知道这种用法是否合法?或者更一般地说,可以安全地分配给std ::函数的对象的规则是什么?

编辑

为了澄清,我关心的问题是lambda函数返回一个int,而func被声明为返回类型为void.我不知道这是否可以,尤其是一旦调用func().

您的代码有未定义的行为.它可能或可能不按照您的期望工作.它的未定义行为的原因是因为20.8.11.2.1 [func.wrap.func.con] / p7:

Requires: F shall be CopyConstructible. f shall be Callable (20.8.11.2) for argument types ArgTypes and return type R.

对于f,要返回类型R,f必须返回隐式转换为std :: function的返回类型(在您的情况下为void).而int并不能隐式转换为void.

我希望你的代码可以在大多数实现中运行.但是至少有一个实现(libc++),它无法编译:

test.cpp:7:30: error: no viable conversion from 'int (int)' to 'std::function<void (int)>'
    std::function<void(int)> ff = f;
                             ^    ~

具有讽刺意味的是,这种行为的理由来自another SO question.

另一个问题提出了std ::函数使用的问题.该问题的解决方案涉及到在编译时执行Requires:子句.相比之下,解决这个问题的方法是禁止执行Requires:子句.

翻译自:https://stackoverflow.com/questions/9339829/using-stdfunctionvoid-to-call-non-void-function

转载注明原文:c++ 使用`std :: function`调用非空函数