提问人:JenyaKh 提问时间:8/16/2023 最后编辑:wohlstadJenyaKh 更新时间:8/17/2023 访问量:114
cpp 文件中的本地函数模板:我应该让它静态吗?
Local function template in cpp file: should I make it static?
问:
// CPP file
template<typename T>
void foo()
{
}
// Use the template only in this CPP as foo<int>, foo<char>, etc.
假设我有 CPP 文件,并且我有一个模板函数仅在此 CPP 文件中供内部使用。我是否理解正确,如果我不将模板放入匿名命名空间或不制作它,则在此 CPP 文件中使用/创建的实例化(例如 、 等)将有外部链接,即将在外面看到。那么,我最好将模板静态化,如下所示还是将其放在匿名命名空间中?foo
static
foo<int>{}
foo<char>{}
// CPP file
template<typename T>
static void 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
这是一个很大的假设。大多数时候,不会有冲突的定义,你会没事的。你的措辞方式听起来像是立即成为未定义的行为。欣赏编辑。
上一个:在 C++ 中专门化函数模板
评论
Foo