在std :: function中返回初始化列表而不是向量

时间:2016-06-18 09:09:06

标签: c++ c++11 vector initializer-list std-function

  

编辑:它不会与链接的问题重复(也是我的)。这里的所有返回类型都是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::functioninitializer-list有什么问题?

3 个答案:

答案 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的样本,但强制了返回类型。

autoreturn {1}的扣除导致std::initializer_list<int>(),与std::vector<int>()预期的std::function不同。