是否可以使用std :: swap;"在标题?

时间:2015-02-25 21:17:08

标签: c++ namespaces argument-dependent-lookup

我已经读过,当您使用c ++进行swap事情时,您应始终using std::swap;,然后调用swap不合格,以便自动选择{ {1}} std::和内置类型的{1},自定义类型的自定义类型,以及其他所有内容的模板std::

那么,我可以将std::放在每个文件包含的标题中,而不必担心它吗?

我知道在标题中避免using std::swap;是常见做法。但是,在这种特殊情况下是否存在问题?

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:0)

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

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

指针的内容被交换。现在尝试交换一对int*。你可能会认为指针是交换的,而是惊讶!它是被交换的内容。

实际上,swap的指南与任何其他using的指南在尽可能最本地范围内相同,而且没有更早,绝对不在标题中。