编辑:它不会与链接的问题重复(也是我的)。这里的所有返回类型都是
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
有什么问题?
答案 0 :(得分:4)
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>>
不兼容。< / p>
答案 1 :(得分:1)
此变体编译:
std::function<std::vector<int>()> foo=[]()->std::vector<int>{
return {1};
};
除了lambda表达式中的显式返回类型之外,这与您的情况4相同。这表明std::function<>
声明的类型不会传播到lambda表达式的解析中; lambda的解析独立于周围的表达式。
我不确定这是C ++语言标准的特性还是现实世界编译器的限制(我用g++ -std=c++11
测试过),因为我不是太多了语言律师。
答案 2 :(得分:1)
(4)中lambda的返回类型是auto
,而不是{2}中的std::vector
,也不是你最后一个使用lambda的样本,但强制了返回类型。
auto
中return {1}
的扣除导致std::initializer_list<int>()
,与std::vector<int>()
预期的std::function
不同。