Как я могу получить доступ к функции C++, если встроенное пространство имен имеет ту же функцию?

Следующая ситуация:

      namespace abc{
    inline namespace x{
        int f() { return 5; }
    }

    inline namespace y{
        int f() { return 6; }
    }

    int f() { return 7; }

    void g(){
        x::f();   // okay
        y::f();   // okay

        f();      // error: ambiguous!
        abc::f(); // error: ambiguous!
    }
}

GCC и clang согласны, вот сообщение об ошибке GCC:

      <source>: In function 'void abc::g()':
<source>:16:10: error: call of overloaded 'f()' is ambiguous
   16 |         f();      // error: ambiguous!
      |         ~^~
<source>:10:9: note: candidate: 'int abc::f()'
   10 |     int f() { return 7; }
      |         ^
<source>:3:13: note: candidate: 'int abc::x::f()'
    3 |         int f() { return 5; }
      |             ^
<source>:7:13: note: candidate: 'int abc::y::f()'
    7 |         int f() { return 6; }
      |             ^
<source>:17:15: error: call of overloaded 'f()' is ambiguous
   17 |         abc::f(); // error: ambiguous!
      |         ~~~~~~^~
<source>:10:9: note: candidate: 'int abc::f()'
   10 |     int f() { return 7; }
      |         ^
<source>:7:13: note: candidate: 'int abc::y::f()'
    7 |         int f() { return 6; }
      |             ^
<source>:3:13: note: candidate: 'int abc::x::f()'
    3 |         int f() { return 5; }
      |             ^
Compiler returned: 1

Я могу явно указатьinline namespaceчтобы получить доступ к перегрузке там, но как насчетabc::f()версия? Я не могу найти синтаксический способ доступа к нему. Неужели нет никакого способа сделать это?

Я знаю, что этот вопрос не очень важен для практики. Тем не менее, мне это интересно.

1 ответ

Вы не знаете. Символы во встроенных пространствах имен являются полностью частью окружающего их пространства имен, а также частью встроенного пространства имен.

Другие вопросы по тегам