可以将"using std::swap;"放在标题中吗?

Is it ok to put "using std::swap;" in a header?

本文关键字:标题 swap using std      更新时间:2023-10-16

我读到,当你用 c++ swap东西时,你应该总是using std::swap;,然后调用 swap unqualified,所以它会自动为std::和内置类型选择std::,为自定义类型选择自定义类型,为其他所有类型选择模板化std::

那么,我可以只using std::swap;放在每个文件都包含的标题中而不必担心吗?

我知道避免在标题中using是常见的做法。但是,在这种特殊情况下,它有问题吗?

交换的指导是在尽可能局部的范围内using std::swap。可以肯定的是,广泛包含的头文件中的某个不符合此要求。它仍然以意想不到的方式污染全局命名空间(有人不希望std::swap会被导入全局命名空间(,应该像using namespace一样避免。

这里的主要问题是,你假设人们没有编写自己的swap,这些恰好是更好的匹配,与std::swap和相关朋友的语义微妙或完全不同的事情。举个简单的例子,考虑

void swap(int* a, int* b);

其中交换指针的内容。现在尝试交换一对int*。您可能会认为指针是交换的,但相反,令人惊讶!交换的是内容。

实际上,swap的指南与任何其他指南相同 - 仅在最局部的范围内using,并且没有更早,绝对不在标头中。