编辑:它没有复制链接的问题(也是我的)。这里所有返回类型均为
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
是什么问题?
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>>
不相容。
(4)中lambda的返回类型为 auto
,而不是(2)中的 std::vector
,而在您的上一个样本中,您仍在使用lambda,但强迫返回类型。
return {1}
中auto
的扣除导致std::initializer_list<int>()
,这与std::vector<int>()
不同的是std::function
期望。
此变体编译:
std::function<std::vector<int>()> foo=[]()->std::vector<int>{
return {1};
};
这与您的案例4相同,除了Lambda表达式中的显式返回类型。这表明std::function<>
声明的类型不会传播到Lambda表达式的解析中。lambda独立于周围的表达方式解析。
我不确定这是C 语言标准的功能还是实际编译器的局限性(我用g++ -std=c++11
进行了测试),因为我不是一个语言律师。<<<<<<<<<<<<<<<</em>