[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/

10-08 22:46