我在 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/