为什么不起作用阻止不同返回类型的施工?

use*_*127 5 c++

std::function 允许你这样做:

std::function<void()> = []()->int{return 42;};
Run Code Online (Sandbox Code Playgroud)

但不是这个:

std::function<void()> = [](int i)->int{return 42;};
Run Code Online (Sandbox Code Playgroud)

大概是因为返回类型不是函数签名的一部分.但是std::function是一个类类型,它被赋予一个返回类型,并且知道它构造的函数对象的返回类型.所以这里可能存在编译器错误.

为什么没有编译器错误?

Yak*_*ont 4

C++11 标准中存在一个错误,导致所有内容std::function<void(???)>完全无法使用。一些编译器将此错误解释为std::function应该忽略存储在此类 a 中的任何内容的返回类型,其他编译器则认为只有 void 与此类 a 兼容std::function

缺陷解决方案中(通过@tc)它被修复,以便 astd::function<void(???)>忽略存储的对象的返回类型(和值)。

您的编译器正在使用当前的解释。

无论如何,参数必须转换为 的参数std::function

简而言之,因为标准(修订版)是这么说的。

在实践中,能够丢弃返回值是很有用的。同时,如果没有数据来调用函数或可调用对象,则无法调用它。我们决定不完美的匹配是可以的(所以如果参数/返回值转换,那std::function就是游戏)。现在你就得到了它。