До C ++ 20 стандарту C ++, коли ми хотіли визначити позакласного оператора, який використовує деякі приватні члени шаблонного класу, ми будемо використовувати конструкцію, подібну до цього:
template <typename T>
class Foo;
template <typename T>
constexpr bool operator==(T lhs, const Foo<T>& rhs);
template <typename T>
class Foo {
public:
constexpr Foo(T k) : mK(k) {}
constexpr friend bool operator==<T>(T lhs, const Foo& rhs);
private:
T mK;
};
template <typename T>
constexpr bool operator==(T lhs, const Foo<T>& rhs) {
return lhs == rhs.mK;
}
int main() {
return 1 == Foo<int>(1) ? 0 : 1;
}
Оскільки C ++ 20, однак, ми можемо опустити позакласне декларацію, таким чином, і пряму заяву, тому ми можемо піти просто:
template <typename T>
class Foo {
public:
constexpr Foo(T k) : mK(k) {}
constexpr friend bool operator==<T>(T lhs, const Foo& rhs);
private:
T mK;
};
template <typename T>
constexpr bool operator==(T lhs, const Foo<T>& rhs) {
return lhs == rhs.mK;
}
Тепер моє запитання: яка частина С ++ 20 дозволяє нам це робити? І чому це не було можливо в попередніх стандартах C ++?
Як було зазначено в коментарях, clang не приймає цей код, представлений у демонстраційній версії, що говорить про те, що це може бути помилкою в gcc.
"c string" == Foo<std::string>("foo")
).