ADL - Funkcja w klasie

0

Cześć,

czytam o ADL na cppreference:

Otherwise, for every argument in a function call expression its type is examined to determine the associated set of namespaces and classes that it will add to the lookup.

  1. For arguments of fundamental type, the associated set of namespaces and classes is empty
  2. For arguments of class type (including union), the set consists of
    a) The class itself
    b) All of its direct and indirect base classes
    c) If the class is a member of another class, the class of which it is a member
    d) The innermost enclosing namespaces in the classes added to the set

Sprawdzam różne opcje i tak. Poniższy kod działa, funkcja f jest sobie w jakiejś przestrzeni nazw blisko A i bez problemu została znaleziona.

class A
{
    friend void f(A) { }
};

int main() {
    A a;
    f(a);
}

Gdy jednak zamienię friend na static to funkcja f już nie może być znaleziona:

class A
{
    static void f(A) { }
};

int main() {
    A a;
    f(a);
}

https://ideone.com/2VDsHQ

Dlaczego tak się dzieje? Funkcja powinna chyba być znaleziona (obstawiam punkt a).

0

Dodam tylko, że dostęp do pól nie ma znaczenia. Ten kod także nie działa:

struct A
{
    static void f(A) { }
};

int main() {
    A a;
    f(a);
}
0

Funkcje statyczne są składnikami klasy, więc powinieneś wywoływać je z użyciem tej nazwy: A::f(a). friend deklaruje przyjaźń poza klasą, więc nawet jeśli jest użyte do definicji, to nie jest ona dodawana wewnątrz pseudo-namespace tej klasy.

0

friend deklaruje przyjaźń poza klasą, więc nawet jeśli jest użyte do definicji, to nie jest ona dodawana wewnątrz pseudo-namespace tej klasy.

Nie jestem tego pewien, jak się do takiej funkcji odwołać bez ADL?

To nie działa:

struct A
{
    friend void f() { }
};
 
int main() {
    f();
}

To nie działa:

struct A
{
    friend void f() { }
    void g() {
        f();
    }
};

int main() {
}

To też nie:

struct A
{
    friend void f() { }
};
 
int main() {
    A::f();
}
0

Nie da się. Tak zdefiniowane funkcje można wywołać wyłącznie za pomocą ADL.

0

Tak podejrzewałem. Co oznacza to a) The class itself ? Chodzi tutaj o funkcje zaprzyjaźnione, czy jest coś jeszcze?

1 użytkowników online, w tym zalogowanych: 0, gości: 1