我们可以在函数内部声明函数(我想要一个局部变量,但它作为函数声明解析):
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)
}
唯一的原因是“因为它使解析器变得更简单”和“因为标准是这样说的”,还是有一个不明确的用途?
答案 0 :(得分:17)
这实际上是一个C问题,因为这种行为是直接从C继承的(尽管由于最令人烦恼的解析而在C ++中得到更多的压力)。
我怀疑答案(至少在C的上下文中)是,这允许您将函数声明的存在范围精确到适合它们的位置。也许这在C的早期是有用的。我怀疑任何人都这样做了,但为了向后兼容,它不能从语言中删除。
答案 1 :(得分:7)
如果您需要使用名称与当前翻译单元(源文件)中的内部(静态)函数或变量冲突的外部函数,这将非常有用。例如(愚蠢但它得到了重点):
static int read(int x)
{
return bar(x);
}
static int foo()
{
ssize_t read(int, void *, size_t);
read(0, buf, 1);
}
答案 2 :(得分:3)
另一个函数内的函数声明隐藏了其他重载函数。例如第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;
}
答案 3 :(得分:1)
唯一的原因是“因为它造成的 解析器更简单“和”因为 标准如此说“
是的,基本上。
所有可以作为函数声明的东西, 是一个函数声明。
不幸的是,这是“正是”案件之一。