返回std ::函数中的初始化器列表,而不是向量

Return initializer list instead of vector in std::function

本文关键字:向量 列表 初始化 函数 std 返回      更新时间:2023-10-16

编辑:它没有复制链接的问题(也是我的)。这里所有返回类型均为std::vector。我不想 返回initializer-list。我想填充返回的 std::vectorinitializer-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是什么问题?

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>