编辑:它不是重复的链接问题(这也是我的)。这里所有的返回类型都是
std::vector。我不想返回一个initializer-list。我想直接用std::vector填充返回的initializer-list
让我们以这四种情况为例:
1)
//Acceptable
std::vector<int> foo(){
return std::vector<int>{1};
}2)
//Acceptable
std::vector<int> foo(){
return {1};
}3)
//Acceptable
std::function<std::vector<int>()> foo=[](){
return std::vector<int>{1};
};4)
//NOT Acceptable
std::function<std::vector<int>()> foo=[](){
return {1};
};为什么4是不能接受的,因为2是可以接受的?他们之间有什么不同?此外,最奇怪的是,这是可以接受的:
//Acceptable
auto bar=[]()->std::vector<int>{
return {1};
};std::function和initializer-list有什么问题?
发布于 2016-06-18 10:32:18
auto bar=[]()->std::vector<int>{指定lambda bar的返回类型为std::vector<int>。
std::function<std::vector<int>()> foo=[](){没有指定foo的返回类型,因为您首先推导出lambda的返回类型,然后分配它。
C++不考虑在决定一个类型时可以将lambda分配给什么,它会看到返回{1},这是一个std::initializer_list<int>,它与std::function<std::vector<int>>不兼容。
发布于 2016-06-18 10:24:24
这一变化汇编如下:
std::function<std::vector<int>()> foo=[]()->std::vector<int>{
return {1};
};这与用例4相同,但lambda表达式中的显式返回类型除外。这表明std::function<>声明的类型不会传播到lambda表达式的解析中;lambda是独立于周围表达式进行解析的。
我不确定这是C++语言标准的一个特性,还是真实世界编译器的局限性(我用g++ -std=c++11__进行了测试),因为我不是一个语言律师。
发布于 2016-06-18 10:24:35
在(4)中,lambda的返回类型是auto,而不是std::vector (2),也不是上一个示例中的std::vector,您仍然在使用lambda,但是强制使用返回类型。
auto在return {1}中的演绎导致了std::initializer_list<int>(),这与std::function所期望的std::vector<int>()不同。
https://stackoverflow.com/questions/37895252
复制相似问题