Объявите функцию друга, которая определена в более раннем определении друга - PullRequest
0 голосов
/ 05 января 2019

Следующее определяет функцию друга в глобальном пространстве имен, объявляет ту же функцию в качестве друга

class Cls {
    friend void func(int) { }
    friend void ::func(int);
};

clang принимает это, в то время как gcc отклоняет с

so.cpp:3:17: error: ‘void func(int)’ has not been declared within ‘::’
     friend void ::func(int);
                 ^~
so.cpp:2:17: note: only here as a ‘friend’
     friend void func(int) { }
                 ^~~~

Похоже, что это должно быть хорошо для меня, это определение функции в глобальном пространстве имен, не так ли? Ошибка gcc довольно очевидна: ей не нравится, когда only дружит. Кто прав?

1 Ответ

0 голосов
/ 05 января 2019

С [namespace.memdef] / 3 :

Объявление друга само по себе не делает имя видимым для неквалифицированного или квалифицированного поиска.

Декларация:

friend void func(int) { }

действительно объявляет имя func в глобальном пространстве имен. Однако это имя не может быть найдено ни неквалифицированным, ни квалифицированным поиском. Он может быть найден только с помощью ADL (, который, поскольку аргумент int, означает, что он вообще не может быть найден Кейси - специалист по ракетам со стальными глазами).

Единственный способ найти этот обычный поиск func - это дополнительно предоставить объявление для него вне тела класса.

gcc правильно отклонить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...