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

问题描述 投票:0回答:1

我看过一些说法静态成员函数有外部链接.

但是,我找不到C++17官方文档中的声明。有谁知道吗?

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

[编辑]

也许问题无法回答,因为这取决于情况。我不明白和想明白的是如何识别内部或外部链接。

“视情况而定”的意思是,

“此外,成员函数、静态数据成员、命名类或类作用域的枚举,或一个 在类范围 typedef 声明中定义的未命名类或枚举,这样类或枚举 具有用于链接目的的 typedef 名称 (10.1.3),具有相同的链接,如果有的话,作为类的名称 它是成员。 (ISO N4659 6.5.5)"

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

这是案例。

【例一】

A.h

class A
{
public:

    A();
    ~A();
};

A.cpp

#include "A.h"

A::A()
{
}

A::~A()
{
}

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

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

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

【例2】

A.h

#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

#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;
}

A 类在示例 1 中出于相同原因具有外部链接。 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 linkage
1个回答
0
投票

C++17标准中的写法可以参考[basic.link]/5:

此外,成员函数、静态数据成员、命名类或类作用域的枚举,或 在类范围 typedef 声明中定义的未命名类或枚举,这样类或枚举 具有用于链接目的的 typedef 名称 (10.1.3),具有相同的链接,如果有的话,作为类的名称 它是会员。

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

© www.soinside.com 2019 - 2024. All rights reserved.