Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数返回类型说明符c++;类型_C++_Gcc_Gcc Extensions - Fatal编程技术网

C++ 函数返回类型说明符c++;类型

C++ 函数返回类型说明符c++;类型,c++,gcc,gcc-extensions,C++,Gcc,Gcc Extensions,我在尝试codefights.com,注意到有人回答了一个问题,这个问题涉及给出向量中所有最长的字符串,请执行以下操作: 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(

我在尝试codefights.com,注意到有人回答了一个问题,这个问题涉及给出向量中所有最长的字符串,请执行以下操作:

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;
}
std::vector r,所有最长字符串(std::vector a){
int b=0;
对于(s:a)如果(s.size()>b)b=s.size();
对于(s:a)如果(s.size()==b)r.push_返回(s);
返回r;
}
他在函数的返回类型说明符中声明了一个变量,有人能告诉我为什么允许这样做吗?我没有在我的机器上编译,而且我找不到一个可以这样做的gcc扩展,提前感谢:)。

查看(decl说明符seq),我不知道如何在函数名之前声明返回变量

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

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;
}
auto allLongestStrings(const std::vector&a){
std::向量r;
标准:尺寸=0;
对于(const auto&s:a)如果(s.size()>b)b=s.size();
对于(const auto&s:a)如果(s.size()=b)r.push_返回(s);
返回r;
}
我修复了代码中的一些其他内容:

  • 为了提高效率,将参数
    a
    声明为常量引用,这样就不会复制它
  • b
    声明为
    std::size\t
    以匹配
    std::vector::size()的返回类型
  • 在循环的范围中,类型说明符是必需的(即使它是
    auto
    );为提高效率增加了常量参考

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

// 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::vector类型的函数allLongestStrings

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


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

您确定解决方案有效吗?如所写,这似乎不是有效的C++。C++不是有效的。GCC的某些版本允许使用这种形式的ranged for,但后来由于标准禁止而被删除。至于在返回类型中声明变量。。。什么?我知道!,for循环也让我困惑,但它在codefights网站上运行,并通过了所有测试:SI会说意图是
std::vector r;std::vector allLongestStrings(…)我认为,这是一个逗号运算符,它利用了测试单元的代码。您的示例显示了混合变量声明和函数声明。OP的代码将变量声明与函数定义混合在一起,这是不同的,是不允许的。。我试图弄清楚他们使用什么包装器,但失败了,至少所有现代编译器在试图通过逗号组合变量声明和函数定义时都会出错。。。要么他们有非常过时的或者异国情调的编译器,他们的包装器是某种类型的模板,在其中粘贴答案,要么发生了一些非常奇怪的事情,将函数定义放在全局范围内的变量后面,就像OP的示例中那样。然后他们可能会使用这种方法,但它并不像您的答案所说的那样符合标准。@interjay我的答案并没有这样说,我明确声明,只有在没有给出定义的情况下,才可以将变量声明与函数声明混合使用。在写负面评论之前,请考虑重读我的答案。