为什么他们坚持在下面的例子中使用`extern`说明符?

Joã*_*nso 6 c++ linkage language-lawyer c++17

[basic.link]/6(我的强调):

在块作用域中声明的函数的名称和由块作用域extern声明声明的变量的名称具有链接. ...

static void f();
static int i = 0;

void g() {
    extern void f(); // internal linkage
    int i; // #2 i has no linkage
    {
        extern void f(); // internal linkage  <--
        extern int i; // #3 external linkage
    }
}
Run Code Online (Sandbox Code Playgroud)

[basic.link]/7:
...

namespace X {
    void p() {
        q(); // error: q not yet declared
        extern void q(); // q is a member of namespace X  <--
    }
    void middle() {
        q(); // error: q not yet declared
    }
    void q() { /* ... */ } // definition of X::q
}
void q() { /* ... */ } // some other, unrelated q
Run Code Online (Sandbox Code Playgroud)

由于extern上面用粗体字符突出显示的段落[basic.link]/6中的第一句话,箭头指向的说明符是没有必要的.我是否遗漏了一些东西?

ild*_*arn 1

extern在那里强调各自的评论,指出extern在某些情况下没有效果(由于该段落中概述的规则)。

在第一个示例中,尽管已声明,但仍f具有内部链接,因为它首先是在命名空间范围内声明的。externstatic

在第二个示例中,extern对声明没有影响,因为q在没有它的情况下也在命名空间范围内声明(并且X::q优先于::q)。