我们可以声明里面的功能(我想要一个局部变量,但它解析为函数声明)功能:
struct bvalue;
struct bdict {
bdict(bvalue);
}
struct bvalue {
explict operator bdict() const;
}
struct metainfo {
metainfo(bdict);
}
void foo(bvalue v) {
metainfo mi(bdict(v)); // parses as function declaration
metainfo mi = bdict(v); // workaround
// (this workaround doesn't work in the presence of explicit ctors)
}
是唯一的理由“因为它使分析器更简单”和“因为标准是这么说的”,或者是有一个不起眼的使用了呢?
这的确是一个C的问题,因为这种行为是直接从C派生(尽管它会用C更按++,因为最伤脑筋的parse)。
我怀疑答案(C中的情况下,至少)是,这可以让你的范围函数声明的存在,精确需要它们的地方。 也许,在C.初期是有益的,我怀疑任何人做任何更多,但为了向后兼容性起见,不能从语言中删除。
如果你需要使用一个外部函数,其名称将与在当前转换单元(源文件)的内部(静态)函数或变量冲突这是非常有用。 例如(愚蠢,但它跨越得到点):
static int read(int x)
{
return bar(x);
}
static int foo()
{
ssize_t read(int, void *, size_t);
read(0, buf, 1);
}
另一个函数内的函数声明隐藏其他重载函数。 7号线如编译器错误
#include <iostream>
void f(int);
int main() {
void f(char *);
f(10); // Line 7
f("Hello world");
return 0;
}
void f(int a) {
std::cout << a;
}
void f(char *str) {
std::cout << str;
}
是唯一的理由“因为它使分析器更简单”和“因为标准是这样说的”
是啊,基本上是这样。
一切都可以是一个函数的声明, 是一个函数声明。
不幸的是它的那些“仅仅是”案件之一。