Return 初始化列表而不是 std::function 中的向量

Return initializer list instead of vector in std::function

Edit: It is not duplicated of the linked question (which is mine also). Here all the return types are std::vector. I do not want to return an initializer-list. I want to fill the returned std::vector by initializer-list directly

让我们以这四种情况为例:

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}; 
};

为什么 2 可以接受而 4 不能接受?他们之间有什么不同?而且,最奇怪的是,这是可以接受的:

//Acceptable
auto  bar=[]()->std::vector<int>{
    return {1}; 
};

std::functioninitializer-list 有什么问题?

此版本编译:

std::function<std::vector<int>()> foo=[]()->std::vector<int>{
    return {1}; 
};

这与您的案例 4 相同,除了 lambda 表达式中的显式 return 类型。这表明 std::function<> 声明的类型不会传播到 lambda 表达式的解析中; lambda 独立于周围的表达式进行解析。

我不确定这是 C++ 语言标准的特性还是现实世界编译器的限制(我用 g++ -std=c++11 测试过),因为我不是太语言律师了。

(4) 中 lambda 的 return 类型是 auto,而不是 (2) 中和您仍在使用的上一个示例中的 std::vector一个 lambda,但强制使用 return 类型。

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

auto bar=[]()->std::vector<int>{ 指定 lambda bar 的 return 类型为 std::vector<int>

std::function<std::vector<int>()> foo=[](){没有指定foo的return类型,因为你先推导出lambda的return类型,然后赋值。

C++ 在决定类型时不考虑您可以将 lambda 分配给什么,它看到 return {1},这是一个 std::initializer_list<int>,与 std::function<std::vector<int>>.