首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函数返回类型说明符c++type中的变量声明

函数返回类型说明符c++type中的变量声明
EN

Stack Overflow用户
提问于 2017-04-17 14:53:02
回答 2查看 572关注 0票数 2

我正在尝试codefights.com,并注意到有人回答了一个问题,这个问题涉及到给出向量中所有最长的字符串这样做:

代码语言:javascript
运行
复制
std::vector<std::string> r, allLongestStrings(std::vector<std::string> a) {
    int b=0;
    for (s:a) if (s.size()>b) b=s.size();
    for (s:a) if (s.size()==b) r.push_back(s);
    return r;
}

他在函数的返回类型说明符中声明了一个变量,谁能告诉我为什么允许这样做?我不能在我的机器上编译,我也找不到能做到这一点的gcc扩展,提前感谢:)。

EN

回答 2

Stack Overflow用户

发布于 2017-04-17 15:51:01

查看reference (decl-说明符-序列),我不明白如何在函数名之前声明返回变量。

使用C++14,您可以使用auto关键字删除重复提及的返回类型:

代码语言:javascript
运行
复制
auto allLongestStrings( const std::vector<std::string>& a ) {
    std::vector<std::string> r;
    std::size_t b = 0;
    for( const auto& s : a ) if( s.size() > b ) b = s.size();
    for( const auto& s : a ) if( s.size() == b ) r.push_back( s );
    return r;
}

我修复了代码中的其他一些东西:

  • 为了提高效率,请将参数a声明为常量引用,这样它就不会被复制
  • 声明为b以匹配范围的返回类型- std::size_t循环,类型说明符是必需的(即使它是auto);为提高效率添加了常量引用<

>F215

Live demo.

票数 1
EN

Stack Overflow用户

发布于 2017-04-17 15:56:12

混合的变量/函数声明似乎是可以的,尽管gcc抱怨说函数定义不应该在那里,但我认为它在全局范围内是可以的。但是,如果没有给出函数定义,即使在非全局范围内,它也是100%有效的语法。此声明只是相同前导类型的几个项的常规声明。例如,我们可以声明多个不同类型但具有相同前导的项,如下所示:

代码语言:javascript
运行
复制
// single line declaration
int i = 0, * p_i = nullptr, ai[2] = {42,42}, geti(void), * * getppi(void);
// the same as
int i = 0;
int * p_i = nullptr;
int ai[2] = {42, 42};
int geti(void);
int ** getppi(void);

因此,r只是一个std::vector<std::string>类型的常规变量,后面是返回相同std::vector类型的函数allLongestStrings。

这种紧凑声明形式的存在是有历史原因的。基本上,它帮助节省了相当多的字节来存储和编译源文件。

这种形式的for循环可能是在当前形式标准化之前的早期实验扩展。

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

https://stackoverflow.com/questions/43446657

复制
相关文章

相似问题

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