我在 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';
}
这意味着虽然代码是半正确的或将来可能是正确的,但注释不是,因为
i
、 j
和 w
不是局部变量,它们没有初始化为 0。它当然也不是 C++ 的“典型”用法。
关于返回参数列表中的 C++ 局部变量(如 CodeFights 所示),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45401131/