Hingga standar C ++ 20 dari C ++, ketika kami ingin mendefinisikan operator di luar kelas yang menggunakan beberapa anggota pribadi dari kelas templat, kami akan menggunakan konstruksi yang mirip dengan ini:
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;
}
Karena C ++ 20, bagaimanapun, kita dapat menghilangkan deklarasi out-of-class, dengan demikian juga deklarasi forward, sehingga kita dapat pergi dengan:
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;
}
Sekarang, pertanyaan saya adalah, bagian mana dari C ++ 20 yang memungkinkan kita melakukannya? Dan mengapa ini tidak mungkin dalam standar C ++ sebelumnya?
Seperti yang ditunjukkan dalam komentar, dentang tidak menerima kode ini yang disajikan dalam demo, yang menunjukkan ini sebenarnya bug di gcc.
Saya mengajukan laporan bug pada bugzilla gcc
"c string" == Foo<std::string>("foo")
)).