cpp 文件中的本地函数模板:我应该将其设为静态吗?

Jen*_*aKh 3 c++ templates c++11

// CPP file

template<typename T>
void foo()
{
}

// Use the template only in this CPP as foo<int>, foo<char>, etc.
Run Code Online (Sandbox Code Playgroud)

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

// CPP file

template<typename T>
static void foo()
{
}
Run Code Online (Sandbox Code Playgroud)

use*_*522 5

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

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

template<typename T>
void foo();
Run Code Online (Sandbox Code Playgroud)

如果使用不同的定义,那么您的程序将违反单一定义规则并出现未定义的行为。

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