在 C++17 文档中哪里说类静态成员函数具有外部链接?

Where in C++17 document say that class static member function has external linkage?

提问人:YoonSeok OH 提问时间:5/1/2023 最后编辑:YoonSeok OH 更新时间:5/2/2023 访问量:150

问:

我看过一些关于静态成员函数具有外部链接的说法。

但是,我无法从 C++17 官方文档中找到该声明。有人知道吗?

如果有人提供 c++17 文档或任何其他版本中的行,说明静态成员函数具有外部链接,将不胜感激。

[编辑]

也许问题无法回答,因为它取决于情况。我不明白和想了解的是如何识别哪个有内部或外部联系。

“取决于情况”的意思是这样的,

“此外,成员函数、静态数据成员、命名类或类范围的枚举,或者 在类范围 TypeDef 声明中定义的未命名类或枚举,使得类或枚举 具有用于链接目的的 typedef 名称 (10.1.3),具有与 它是会员。(ISO N4659 6.5.5)”

它没有提到静态成员“函数”。所以我不确定它是否适用。

这是示例案例。

[示例1]

class A
{
public:

    A();
    ~A();
};

.cpp

#include "A.h"

A::A()
{
}

A::~A()
{
}

A类具有外部链接,因为它属于

  • 命名空间 (global),它不是未命名的命名空间。
  • “所有其他命名空间都有外部链接”(ISO N4659 6.5.4)

例如,只要包含标头,构造函数对不同的 cpps 是“可见的”,表明它是外部链接,即“它所表示的实体可以通过 其他翻译单元或来自同一翻译单元的其他范围“(ISO N4659 6.5.2.1)。

[示例2]

#pragma once
class A
{
public:

    static void Foo()
    {
    }

    A(){}
    ~A(){}
};

B.h

#pragma once
class B
{
public:

    void Bar();

    B();
    ~B();
};

B.cpp

#include "B.h"
#include "A.h"

void B::Bar()
{
    A::Foo();
}

B::B()
{
}

B::~B()
{
}

C.h.(英语:C.h)

#pragma once
class C
{
public:

    void Bar();

    C();
    ~C();
};

C.cpp

#include "C.h"
#include "A.h"

void C::Bar()
{
    A::Foo();
}

C::C()
{
}

C::~C()
{
}

main.cpp

#include <iostream>
#include "B.h"
#include "C.h"

int main()
{
    B b;
    C c;
    b.Bar();
    c.Bar();

    return 0;
}

由于示例 1 中相同的原因,A 类具有外部链接。 A 中的静态成员函数 Foo 具有外部链接,因为

"命名空间范围内类的成员函数具有 该类的链接。局部类 (12.4) 的成员函数没有关联。(ISO N4659 12.2.1.2)

在此语句中,它没有明确提到“静态”成员函数属于此“成员函数”。

简而言之,从示例 2 中,

  • A类具有外部链接,因为

“所有其他命名空间都有外部链接”(ISO N4659 6.5.4)

  • static void Foo 具有外部链接,因为

“此外,成员函数、静态数据成员、类作用域的命名类或枚举,或类作用域 typedef 声明中定义的未命名类或枚举,使得该类或枚举具有用于链接目的的 typedef 名称 (10.1.3),具有与其所属类的名称相同的链接(如果有的话)。(ISO N4659 6.5.5)”

“命名空间范围内类的成员函数具有该类的链接。局部类 (12.4) 的成员函数没有关联。(ISO N4659 12.2.1.2)

我理解正确吗?

C++ Static static-members 联动

评论

1赞 user207421 5/1/2023
ISO/IEC 14882, 1998, #3.5(6):“如果类的名称具有外部链接,则成员函数、静态数据成员、类或类范围的枚举具有外部链接”。另请参阅 cppreference
0赞 dalfaB 5/1/2023
它不是特定于静态的,任何成员函数都具有与其类相同的链接。大多数类都有外部链接,因此对于它们的功能。匿名命名空间中的类函数或具有模块链接(自 C++20 起)没有外部链接。

答:

0赞 Brian Bi 5/2/2023 #1

C++17 标准的措辞可在 [basic.link]/5 中找到:

此外,成员函数、静态数据成员、命名类或类范围的枚举,或者 在类范围 TypeDef 声明中定义的未命名类或枚举,使得类或枚举 具有用于链接目的的 typedef 名称 (10.1.3),具有与 它是会员。

静态成员函数是成员函数,因此如果类名具有外部链接,则类的静态成员函数的名称也具有外部链接。但是类名也可以有内部链接或没有链接(在 C++20 中,它们也可以有模块链接)。