在CPP文件的匿名名称空间中具有模板函数是否合适

Is it proper to have a template function inside an anonymous namespace of a cpp file?

本文关键字:函数 是否 文件 CPP 空间      更新时间:2023-10-16

我想在CPP文件的匿名名称空间中具有模板函数,纯粹是STD ::不同大小的阵列类型的助手函数。此功能不得在此翻译单元之外的任何地方使用。

对我来说很令人惊讶,当我在MSVC 14.1(简化代码)中尝试时,这立即奏效:

namespace
{
template<std::size_t SIZE>
bool isPushed(std::uint32_t id, std::array<std::uint32_t, SIZE>& states)
{
    if(id >= states.size())
    {
        return false;
    }
    return ((states[id] & 32U) > 0U);
}
}

这是否符合C 标准?

根据我所知道的,模板总是需要在标题中声明(通常也实现),为什么不在这种情况下?

这是否符合C 标准?

绝对。

根据我所知道的,模板总是需要在标题中声明(通常也实现),为什么不在这种情况下?

仅当模板用于多个翻译单元(读取.cpp文件)时,这主要是正确的。有多种方法可以使用extern template在.cpp文件中实现模板。请参阅https://msdn.microsoft.com/en-us/library/by56e477.aspx。

但是,当它仅在一个.cpp文件中使用时,在.cpp文件中定义它是完全可以的。


其他信息,响应OP的评论

来自https://timsong-cpp.github.io/cppwp/n3337/temp#4

模板名称具有链接。

来自https://timsong-cpp.github.io/cppwp/n3337/basic.link#2.2

- 当名称具有内部链接时,它表示它表示的实体可以由同一翻译单元中其他范围的名称引用。

来自https://timsong-cpp.github.io/cppwp/n3337/basic.link#4

在未命名的名称空间内直接或间接声明的未命名命名空间或名称空间具有内部链接。所有其他名称空间都有外部链接。具有命名空间范围的名称,上面尚未给出内部链接的名称,如果是

的名称,则具有与封闭名称空间相同的链接

...

- 模板。

从上面,我们可以得出结论,isPushed具有内部链接。它只能在翻译单元中引用。