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是一个类类型,它被赋予一个返回类型,并且知道它构造的函数对象的返回类型.所以这里可能存在编译器错误.
为什么没有编译器错误?
C++11 标准中存在一个错误,导致所有内容std::function<void(???)>完全无法使用。一些编译器将此错误解释为std::function应该忽略存储在此类 a 中的任何内容的返回类型,其他编译器则认为只有 void 与此类 a 兼容std::function。
在缺陷解决方案中(通过@tc)它被修复,以便 astd::function<void(???)>忽略存储的对象的返回类型(和值)。
您的编译器正在使用当前的解释。
无论如何,参数必须转换为 的参数std::function。
简而言之,因为标准(修订版)是这么说的。
在实践中,能够丢弃返回值是很有用的。同时,如果没有数据来调用函数或可调用对象,则无法调用它。我们决定不完美的匹配是可以的(所以如果参数/返回值转换,那std::function就是游戏)。现在你就得到了它。
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |