我在 CodeFights.com 上看到过这种形式的 C++ 函数语法:

int i,j,w,myFunction(auto s, auto v) {
  // here, i, j,and w are local variable, apparently initialized to 0
  // all work done inside this function is typical, legal C++
  return [some int value];
}

我一直在网上搜索以识别这种语法,但我不能。这是合法的 C++ 还是 CodeFights 特有的语法?有人可以给我这种初始化的名称,以便我可以查找吗?

最佳答案

代码可能成为合法的 C++20。这就是为什么...

C++ 中的 C 声明遗产的怪癖之一是多个声明可以在一行上。

int a, b, c;

如您所知,您可以向混合添加指针和引用,保留“基本”类型:
int a, *b, &c = x;

将此语法怪癖扩展到函数声明也是合法的。下面将 f 声明为一个返回 int 的函数:
int a, b, c, f();

给定适当的上下文,您甚至可以在同一行定义函数:
struct S {
    int a, b, c, f() { return 0; }
};

当然,您可以向函数添加参数:
struct S {
    int a, b, c, f(float x, double y) { return x + y; }
};

最后一步是将这些参数类型转换为 auto ,C++20 可能允许将其作为概念提案 a feature originally planned for C++17 的一部分。

GCC 已经支持这种语法作为扩展。这是一个完整的例子:
#include <iostream>

struct S {
    int a, b, c, f(auto x, auto y) { return x + y; }
};

int main()
{
    S s;
    std::cout << s.f(1.0, 2.0) << '\n';
}

这意味着虽然代码是半正确的或将来可能是正确的,但注释不是,因为 ijw 不是局部变量,它们没有初始化为 0。

它当然也不是 C++ 的“典型”用法。

关于返回参数列表中的 C++ 局部变量(如 CodeFights 所示),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45401131/

10-11 16:52