命名空间的使用、意外行为

alb*_*ert 5 c++

test.cpp


enum {

  ERR_FILE_ACCESS       = 1,
  ERR_WHATEVER
};

enum ERR : unsigned int {

  ERR_FILE_ACCESS     = 5,
  ERR_FILE_FORMAT     = 6
};

int main(int, char**)
{
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

当然,重新定义枚举器“ERR_FILE_ACCESS”会失败。但:

test2.cpp

enum {

  ERR_FILE_ACCESS       = 1,
  ERR_FILE_FORMAT,
  ERR_WHATEVER
};

namespace Internal {

  enum ERR : unsigned int {

    ERR_FILE_ACCESS     = 5,
    ERR_FILE_FORMAT     = 6
  };
}
using namespace Internal;

int main(int, char**)
{
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

确实编译成功。

我很惊讶/困惑,为什么命名空间 - after using namespace Internal;- 可以防止名称冲突?

use*_*570 3

为什么命名空间 - after using namespace Internal;- 可以防止名称冲突?

因为在第二种情况下,枚举器位于不同的命名空间中,并且 using 指令实际上并未将名称添加到它出现的声明性区域(在本示例中是全局范围/命名空间) 。

这可以从using 指令的文档中看出:

using 指令不会将任何名称添加到它出现的声明区域(与 using 声明不同),因此不会阻止声明相同的名称。


这种行为并不危险。只要您不使用“冲突”符号之一(这里是枚举器),一切都很好,但是当您尝试使用其中之一时,您会收到“符号不明确”错误。