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

时间:2016-06-05 23:41:23

标签: c++

std::function允许您这样做:

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

但不是这样:

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

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

为什么没有编译器错误?

1 个答案:

答案 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是游戏)。你有它。