std::function
允许您这样做:
std::function<void()> = []()->int{return 42;};
但不是这样:
std::function<void()> = [](int i)->int{return 42;};
大概是因为返回类型不是函数签名的一部分。但是std::function
是一个类类型,它被赋予一个返回类型并且知道它构造的函数对象的返回类型。因此,这里存在编译器错误的可能性。
为什么没有编译器错误?
答案 0 :(得分:4)
有一个bug in the C++11 standard使所有std::function<void(???)>
完全无法使用。一些编译器将错误解释为应该忽略存储在这样的std::function
中的任何内容的返回类型,而其他只有void的内容与这样的std::function
兼容。
在defect resolution(来自@ t.c)中,它被修复,以便std::function<void(???)>
忽略存储对象的返回类型(和值)。
您的编译器正在使用该解释,这是当前解释。
无论如何,必须将参数转换为std::function
的参数。
简而言之,因为标准(修订版)是这样说的。
实际上,能够丢弃返回值非常有用。同时,您无法在没有数据的情况下调用函数或可调用对象来调用它。确定不完美的匹配是正确的(因此如果参数/返回值转换,std::function
是游戏)。你有它。