我了解匿名命名空间的一般用途是包含仅对当前源(即非标头)文件可见的代码。但是,我无法找到有关以下情况中发生的情况的任何信息:
// 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>;
}
Run Code Online (Sandbox Code Playgroud)
和Vec1有Vec2什么不同吗?由于我想不出一种方法可以在头文件中引用“extern”类型别名Vec1,因此我不确定这里的匿名命名空间是否能实现任何目标。
匿名名称空间主要影响链接。单独的类型别名没有链接,因此在您的情况下两者是相同的。
也就是说,某些包含的标头可能还定义了具有相同名称的模板类型别名,但它是不同类型的别名。然后有一个区别;如果您将所有实现细节函数也保留在与别名相同的匿名命名空间中,则不会出现错误,而对于您编写的非命名空间别名,程序将格式不正确。
我们通常使用匿名命名空间,这样我们就不会意外地提供另一个标头中声明的函数的实现。它们还可以用于确保我们没有为extern在其他地方声明的变量定义存储。
使用类型别名,就不存在泄漏实现的风险。
| 归档时间: |
|
| 查看次数: |
645 次 |
| 最近记录: |