Ich portiere eine C++ 14-constexpr
Codebasis von Clang zu den neuesten g ++ - 5.1. Betrachten Sie das folgende reduziert Code-Schnipsel eines home-grown bitset
Klasse, die korrekt, da die glückliche Zeit von Clang 3.3 wurde Kompilieren (fast 2 Jahren!)Constexpr ist in der Deklaration der Freundes-Template-Spezialisierung nicht erlaubt?
#include <cstddef>
template<std::size_t>
class bitset;
template<std::size_t N>
constexpr bool operator==(const bitset<N>& lhs, const bitset<N>& rhs) noexcept;
template<std::size_t N>
class bitset
{
friend constexpr bool operator== <>(const bitset<N>&, const bitset<N>&) noexcept;
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <-- error from this piece
};
template<std::size_t N>
constexpr bool operator==(const bitset<N>& /* lhs */, const bitset<N>& /* rhs */) noexcept
{
return true;
}
int main() {}
Live example auf Wandbox. Allerdings g ++ - 5.1 und die aktuelle Kofferraumentriegelung einem Fehler geben:
'constexpr' is not allowed in declaration of friend template specialization
Frage: ist dies ein bekannter g ++ Fehler oder Clang nicht auf die neueste Norm konform?
Hinweis: die oben verwendet nur C++ 11-Stil constexpr
Funktionen, da es keine Änderungen statt innerhalb operator==
, so scheint es einige seltsame Störungen zwischen Vorlagen, Freunde und constexpr.
UPDATE: als bug 65977 auf Bugzilla abgelegt.
Und 4.8.2 beschwert sich über [einen fremden 'Inline'-Spezifizierer] (http://melpon.org/wandbox/permlink/ZNUj29hUVVn5RgJr) ... – Columbo
Ich sehe keine offensichtlichen Antworten darauf, es kann sein hilfreich, um einen GCC-Bug-Bericht zu öffnen, vor allem, da ihre Implementierungsdifferenz zwischen Clang und Gcc ist. Ich sehe keine Mängel, die sich darauf beziehen und obwohl Marcos Antwort vielleicht richtig ist, ist sie mir offensichtlich nicht richtig. –
Ich persönlich hätte das Kopfgeld an Ort und Stelle gelassen, so dass die Antwort mehr Upvotes hätte erhalten können. Es ist eine perfekte Antwort und verdient mehr als 2 Stimmen. –