Использование операторов из другого пространства имен через унаследованный класс? - PullRequest
0 голосов
/ 02 ноября 2018

Почему следующий фрагмент кода компилируется (и печатается V::operator+)?

#include <iostream>

namespace V {

struct B {};

template<typename T>
auto operator+(T rhs) -> T {
    std::cout << "V::operator+\n";
    return rhs;
}

}

struct A : V::B {};

int main() {
    +A();
}

Класс A находится вне пространства имен V и наследуется от B, который находится внутри V. V также содержит шаблон оператора, который можно использовать, например, в B.

Нет operator+ определено для A за пределами V, и все же его можно вызвать на A без какой-либо квалификации (что-то вроде V::operator+(A())). Удаление наследования приводит к ожидаемой ошибке 'operator+' not defined.

Почему этот оператор может использоваться вне V без квалификации?

1 Ответ

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

Поиск, зависящий от аргументов, распространяется на пространства имен базовых классов. [Basic.lookup.argdep] /2.2:

Если T является типом класса (включая объединения), его ассоциированными классами являются: сам класс; класс, членом которого он является, если таковой имеется; и его прямые и косвенные базовые классы. Связанные с ним пространства имен являются внутренним пространством имен связанных классов.

Таким образом, когда компилятор ищет operator+ для применения к типу A, он также ищет в пространстве имен V, поскольку A имеет базовый класс, который является членом V.

...