Если объявление использования может ссылаться на функцию друга - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть класс с функцией друга, определенной в заголовке класса.Когда я делаю объявление об использовании этой функции-друга, она работает в MSVC2017, но ни в GCC 8.2, ни в Clang 7.0.Кто прав?Вот ссылка на Godbolt (https://godbolt.org/z/_7MVlh),, а вот код:

namespace vec {

class Vec {
    friend Vec vec_max(const Vec& a, const Vec& b) { return a; }
};

}

void test() {
    using vec::vec_max;
}

GCC выдает ошибку при объявлении использования: "error: нет члена с именем 'vec_max' в пространстве имен 'vec'". Clang дал похожее сообщение. MSVC скомпилировал его, как и предполагалось.

Насколько я понимаю, vec_max должен находиться в пространстве имен vec, а MSVC должен быть корректным. Но в стандарте могут быть некоторые тонкие записи, которые делаютболее ограниченная интерпретация gcc и clang правильная (хотя и менее интуитивная).

1 Ответ

0 голосов
/ 21 ноября 2018

MSVC здесь не так.Когда функция-друг определяется встроенной в определении класса и не объявляется снаружи, ее нельзя найти при обычном поиске имени, и только Аргумент-зависимый поиск должен быть в состоянии найти ее.

Цитирование C ++ 17 (n4659):

14.3 [class.friend]

6 Функция может быть определена в объявлении друга класса, если и только если класс является нелокальным классом (12.4), имя функции не определено, а функция имеет область видимости....

7 Такая функция неявно является встроенной функцией (10.1.6).Функция friend, определенная в классе, находится в (лексической) области видимости класса, в котором она определена.Функция друга, определенная вне класса, не является (6.4.1).

и 6.4.2 / 4 [basic.lookup.argdep]

При рассмотрении связанныхпространство имен, поиск аналогичен поиску, выполняемому, когда связанное пространство имен используется в качестве квалификатора (6.4.3.2), за исключением того, что:

  • (4.1) ...

  • (4.2) Любые дочерние функции области имен или шаблоны дочерних функций, объявленные в связанных классах, видимы в своих соответствующих пространствах имен, даже если они не видны во время обычного поиска (14.3).

  • (4,3) ...
...