匿名命名空间中的C++类型别名

5

我理解使用匿名命名空间的一般情况是为了包含仅应在当前源文件(即非头文件)中可见的代码。但是,我无法找到有关下面情况发生的任何信息:

// In foo.cpp

#include <vector>

// Choice #1
template <typename T>
using Vec1 = std::vector<T>;

// Choice #2
namespace {

template <typename T>
using Vec2 = std::vector<T>;

}

Vec1Vec2 有什么区别吗?由于我无法想到一种在头文件中具有“extern”类型别名以引用Vec1的方法,所以我不确定这里的匿名命名空间是否起到任何作用。

1个回答

3

匿名命名空间主要影响链接。仅有类型别名没有链接,因此在您的情况下,两者是相同的。

话虽如此,可能会有一些包含的头文件也定义了一个与之相同名称的模板类型别名,但它将不同类型进行别名。这时就有所区别;如果您将所有实现细节函数也放在与您的别名相同的匿名命名空间中,则不会出错,而对于您编写的非命名空间别名,程序将无效。


我们通常使用匿名命名空间,以避免无意中提供声明在其他头文件中的函数的实现。它们还可用于确保我们未为在其他地方声明的extern变量定义存储。

对于类型别名,不存在泄漏实现的风险。


类型别名没有链接,但是别名模板有(因为所有模板都有)。这可能会影响到提及它们的模板特化所生成的符号。 - Davis Herring

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接