C ++のC ++ 20標準までは、テンプレートクラスのいくつかのプライベートメンバーを使用するクラス外の演算子を定義する場合、次のような構成を使用していました。
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;
}
さて、私の質問は、C ++ 20のどの部分がそれを可能にするのですか?そして、なぜ以前のC ++標準ではこれが可能でなかったのですか?
コメントで指摘されたように、clangはデモで提示されたこのコードを受け入れません。これは、これが実際にはgccのバグである可能性を示唆しています。
gccのバグジラに関するバグレポートを提出しました
"c string" == Foo<std::string>("foo")
))を避けています。