cpp 文件中的本地函数模板:我应该让它静态吗?

Local function template in cpp file: should I make it static?

提问人:JenyaKh 提问时间:8/16/2023 最后编辑:wohlstadJenyaKh 更新时间:8/17/2023 访问量:114

问:

// CPP file

template<typename T>
void foo()
{
}

// Use the template only in this CPP as foo<int>, foo<char>, etc.

假设我有 CPP 文件,并且我有一个模板函数仅在此 CPP 文件中供内部使用。我是否理解正确,如果我不将模板放入匿名命名空间或不制作它,则在此 CPP 文件中使用/创建的实例化(例如 、 等)将有外部链接,即将在外面看到。那么,我最好将模板静态化,如下所示还是将其放在匿名命名空间中?foostaticfoo<int>{}foo<char>{}

// CPP file

template<typename T>
static void foo()
{
}
C++ C++11 模板

评论

0赞 StoryTeller - Unslander Monica 8/16/2023
我会同时做命名空间和限定符。您还希望模板具有内部链接。Aa 用于实例化...无论是故意的还是错误(在编译器或标准中),冗余都是无害的。
0赞 HolyBlackCat 8/16/2023
是的,你应该。否则,如果您有 >1 TU 和具有相同名称的模板,它们可能会以糟糕的方式合并。
0赞 Mark Ransom 8/16/2023
@HolyBlackCat这就是“一个定义规则”存在的原因。
0赞 tbxfreeware 8/16/2023
你的想法是对的。通过实例化模板创建的函数是常规函数,而不是模板。除非将它们放在匿名命名空间中,或者使用静态链接声明它们,否则它们将对链接器可见。这是一个选择退出的交易。如果您切换到模块,您可能会喜欢模块对链接采取的选择加入方法。如果不从模块中主动导出名称,则该名称仍保留在模块内部。无需匿名命名空间。Foo

答:

5赞 user17732522 8/16/2023 #1

整个函数模板默认具有外部链接。专用化/实例化没有任何单独的链接属性。然而,由于是一个模板,因此允许在多个翻译单元中具有多个定义,但前提是它们完全相同foo

如果你没有显式地给它内部链接,而另一个翻译单元恰好定义了签名和名称的另一个函数模板

template<typename T>
void foo();

使用不同的定义,则您的程序将违反单一定义规则并具有未定义的行为。

所以是的,它必须被声明或在一个匿名命名空间中,如果(可能)是这种情况的话。static

评论

0赞 Mark Ransom 8/17/2023
我觉得必须有点强。但是,强烈建议您这样做。
0赞 user17732522 8/17/2023
@MarkRansom 假设另一个翻译单元中存在相互冲突的定义,这是必须的。我在回答中澄清了这一点。
0赞 Mark Ransom 8/17/2023
这是一个很大的假设。大多数时候,不会有冲突的定义,你会没事的。你的措辞方式听起来像是立即成为未定义的行为。欣赏编辑。