C++ 为什么';t功能防止不同返回类型的构造?

C++ 为什么';t功能防止不同返回类型的构造?,c++,C++,std::function允许您执行以下操作: std::function<void()> = []()->int{return 42;}; std::function=[]()->int{return 42;}; 但不是这个: std::function<void()> = [](int i)->int{return 42;}; std::function=[](inti)->int{return 42;}; 可能是因为返回类型不是函数签名的一部分。

std::function
允许您执行以下操作:

std::function<void()> = []()->int{return 42;};
std::function=[]()->int{return 42;};
但不是这个:

std::function<void()> = [](int i)->int{return 42;};
std::function=[](inti)->int{return 42;};
可能是因为返回类型不是函数签名的一部分。但是
std::function
是一个类类型,它给定了一个返回类型,并且知道构造它的函数对象的返回类型。所以这里可能有编译器错误

为什么没有编译器错误?

有一个错误使得所有的
std::函数
完全不可用。一些编译器将此错误解释为,应该忽略存储在此类
std::function
中的任何内容的返回类型,而其他编译器则认为只有void与此类
std::function
兼容

在(via@t.c)中,它是固定的,因此
std::function
忽略存储的对象的返回类型(和值)

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

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

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


实际上,能够放弃返回值是很有用的。同时,如果没有数据来调用函数或可调用对象,则无法调用它。我们决定不完全匹配是可以的(因此,如果参数/返回值转换,
std::function
就是游戏)。这就是你的代码。

你的代码还有未定义的行为。@sleeptightpupper:它不是第一个的副本,因为第一个是关于参数的,而不是不同的返回类型。@NicolBolas它肯定是一个。它的缩写是
int
不能隐式转换为
void
,因此我们得到了未定义的行为。@sleeptightpupper@user6412786:他不是在问它是否定义良好的行为。他在问为什么这不是编译错误。那是另一个问题。