不同 C++ 文件中未命名命名空间中的名称可以指代同一个命名的东西吗?

edd*_*kuo 3 c++ language-lawyer c++17

Clang 和 GCC 在这个问题上有不同的意见:

使用 g++ 打印“result2”,但使用 clang++ 打印“result1”。

我知道g++认为A抛出的g(),不一样的A是main.cpp。
但是,clang++ 有什么问题吗?

版本:
g++:7.4.0
叮当:10.0.0

主.cpp:

#include <iostream>

namespace {
  struct A {};
}

extern void g();

int main()
{
  try {
    try {
      g();
    } catch (A) {std::cout << "result1\n";}
  } catch (...) {std::cout << "result2\n";}
}
Run Code Online (Sandbox Code Playgroud)

其他.cpp:

namespace {
  struct A {};
}

void g() { throw A(); }
Run Code Online (Sandbox Code Playgroud)

Dav*_*ing 6

这些名字在这里A内部联系;它们不可能在不同的翻译单元中指代相同的事物。在这种情况下,GCC 是正确的;一些实现使用名称来实现 RTTI,这可能是错误的。