[basic.scope.pdecl]/7:
考虑上面的情况(7.2),其中在命名空间范围中定义的函数的参数声明子句的decl-specifier-seq中使用了elaborated-type-specifier。这个精巧的类型说明符必须是该类在其命名空间中的的第一个声明,这一事实如何与之相协调?
考虑下面的示例(demo):
文件prog.cc
:
struct S;
extern S s;
int S;
void f(struct S&); // The elaborated-type-specififer `struct S` is not
// the first declaration in the global namespace and
// if we eliminate the first declaration `struct S;`
// on the top, the code doesn't compile !!
int main(){
f(s);
}
文件
other.cc
:#include<iostream>
struct S{
int i = 1;
};
void f(struct S& s) { std::cout << s.i << '\n'; }
S s;
请注意,上面的代码可以正确编译并执行,但是函数
f
的参数声明子句中的细化类型指定符不是全局命名空间中的第一个。假设我对[basic.scope.pdecl]/7的解释是正确的,我想看一个示例,显示上面第(7.2)段的应用,其中所指的声明将是其命名空间中的首先是。
最佳答案
那是因为您在使用它之前仍需要声明一个名称。
int S;
void f(struct S&);
extern struct S s; // If you write this line before then it
// will not compile.
// The name still needs to be declared
// before you use it.
// If you drop the `int S` above, then the following
// will also compile, since S has already been declared
// extern S s2;
int main(){
f(s);
}
我不明白您要在这里提出的重点。由于不是第一个,所以没有声明任何名称,并且[basic.scope.pdecl] p7不适用。
auto addrof(struct S& s) { // First declaration
return &s;
}
int get(struct T&); // First declaration
关于c++ - 我在理解[basic.scope.pdecl]/7时遇到了一些困难,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55227455/