Могут ли имена в безымянных пространствах имен в разных файлах C ++ относиться к одной и той же именованной вещи? - PullRequest
3 голосов
/ 06 января 2020

Clang и G CC имеют разное мнение по этой проблеме:

С g ++ выводится «result2», но с clang ++ это «result1».

Я знаю, что g ++ думает, что A, брошенный g(), не тот же самый A является основным. cpp.
Но есть ли что-то не так с clang ++?

версия:
g ++: 7.4.0
лязг: 10.0.0

main. 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";}
}

прочее. cpp:

namespace {
  struct A {};
}

void g() { throw A(); }

1 Ответ

6 голосов
/ 06 января 2020

Имена A имеют внутреннюю связь здесь; они не могут ссылаться на одну и ту же вещь в разных единицах перевода. G CC является правильным в этом случае; некоторые реализации используют имена для реализации RTTI, что может быть ошибкой здесь.

...