首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回初始化列表,而不是在std::function中返回向量

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

Stack Overflow用户
提问于 2016-06-18 09:09:05
回答 3查看 2.2K关注 0票数 6

编辑:它不是重复的链接问题(这也是我的)。这里所有的返回类型都是std::vector。我不想返回一个initializer-list。我想直接用std::vector填充返回的initializer-list

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

1)

代码语言:javascript
复制
//Acceptable
std::vector<int> foo(){
    return std::vector<int>{1}; 
}

2)

代码语言:javascript
复制
//Acceptable
std::vector<int> foo(){
    return {1};    
}

3)

代码语言:javascript
复制
//Acceptable
std::function<std::vector<int>()> foo=[](){
    return std::vector<int>{1}; 
};

4)

代码语言:javascript
复制
//NOT Acceptable
std::function<std::vector<int>()> foo=[](){
    return {1}; 
};

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

代码语言:javascript
复制
//Acceptable
auto  bar=[]()->std::vector<int>{
    return {1}; 
};

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-18 10:32:18

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
EN

Stack Overflow用户

发布于 2016-06-18 10:24:24

这一变化汇编如下:

代码语言:javascript
复制
std::function<std::vector<int>()> foo=[]()->std::vector<int>{
    return {1}; 
};

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

我不确定这是C++语言标准的一个特性,还是真实世界编译器的局限性(我用g++ -std=c++11__进行了测试),因为我不是一个语言律师。

票数 1
EN

Stack Overflow用户

发布于 2016-06-18 10:24:35

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

autoreturn {1}中的演绎导致了std::initializer_list<int>(),这与std::function所期望的std::vector<int>()不同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37895252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档