gpt4 book ai didi

c++ - 命名空间中 using 声明的范围

转载 作者:IT老高 更新时间:2023-10-28 12:29:58 24 4
gpt4 key购买 nike

在 C++ 头文件中使用命名空间中的 using 声明是否安全(且正确),如下所示:

#include <boost/numeric/ublas/vector.hpp>
namespace MyNamespace {
using boost::numeric::ublas::vector;
vector MyFunc(vector in);
}

即“使用 boost::numeric::ublas::vector”是否正确包含在 MyNamespace block 中,或者这会污染包含此 header 的任何文件的 namespace ?

最佳答案

不,它不安全 - 它不会污染另一个命名空间,但由于其他原因很危险:

using 指令将通过您指定的名称将任何当前可见的内容导入您使用它的命名空间。虽然您的 using 仅对 MyNamespace 的用户可见,但“外部”的其他内容将对您的 using 声明可见。

那么在标题中使用时这有多危险?因为它将导入在声明时可见的内容,所以确切的行为将取决于您在声明之前包含的 header 的顺序(从 boost::numeric::ublas::vector )。由于您无法真正控制在您的 header 之前包含哪些 header (您也不应该这样做! header 应该是自给自足的!),这可能会导致非常奇怪的问题,您的函数会在一个编译单元中找到一个东西,而另一个在下一个。

根据经验,using 声明只能在 之后使用 .cpp 文件中的所有内容。在 Sutter 和 Alexandrescu 所著的“C++ 编码标准”一书中(第 59 项)中也有一个关于这个确切问题的项目。这是一个报价:

But here's the common trap: Many people think that using declarations issued at namespace level (...) are safe. They are not. They are at least as dangerous, and in a subtler and more insidious way.

即使您使用的名称不太可能不存在于其他任何地方(可能就是这里的情况),事情可能会变得丑陋:在标题中,所有声明都应该是 完全合格。这很痛苦,但否则,可能会发生奇怪的事情。

另见 Migrating to Namespaces , Using-declarations and namespace aliasesNamespace Naming示例和深入描述的问题。

关于c++ - 命名空间中 using 声明的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6175705/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com