【问题标题】:Is it ok to put "using std::swap;" in a header?是否可以输入“使用 std::swap;”?在标题中?
【发布时间】:2015-02-25 21:17:07
【问题描述】:

我读过,当您在 c++ 中使用 swap 时,您应该始终使用 using std::swap;,然后调用不合格的 swap,因此它会自动为 std:: 和内置类型选择 std:: ,用于自定义类型的自定义类型,以及用于其他所有内容的模板化 std::。

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

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

【问题讨论】:

  • @aruisdante 不,不是。 OP 正在询问一种特定的用法。
  • @Pradhan 我认为,一种特殊的用法不会使使用using 污染全局命名空间更有效。
  • @aruisdante 可能,如果确实调用swap 而不将std::swap 引入当前范围几乎总是一个错误。这就是OP有效地要求的。所以这使得另一个问题不再重复。请注意,我并不是在表达对这种做法的看法 - 只是指出对于这个问题可能会有一个更细微的答案。
  • 你可以在头文件中使用它,只要你在函数内部,在头文件中使用它,这样它的作用域就限制在那个函数中。这是一种常见的做法。您应该不将它放在头文件中的文件范围内。

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


【解决方案1】:

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

【讨论】:

  • 我会得到什么意外行为?
【解决方案2】:

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

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

指针的内容被交换的地方。现在尝试交换一对int*。您可能会认为指针被交换了,但是,令人惊讶的是!这是正在交换的内容。

真的,swap 的指导与任何其他指导相同——只有using 在可能的最本地范围内,而不是更早,而且绝对不在标头中。

【讨论】:

  • 如果有人写了void swap(int *a, int *b);,而你的函数在两个指向int的指针上写了using std::swap; swap(x, y);,那么你会遇到同样的问题(它会找到更好的匹配而不是使用std::swap)。所以我认为这里的问题是伪造的交换功能会搞乱一切。
  • @MattMcNabb 不,一旦在本地范围内找到名称,不合格的查找就会停止;你不会拿起外面宣布的虚假交换。而且也没有 ADL。
猜你喜欢
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 2012-12-22
相关资源
最近更新 更多