Почему следующий фрагмент кода компилируется (и печатается 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
без квалификации?