Przekazuję kodowanie C++ 14- constexpr
z Clang do najnowszego g ++ - 5.1. Rozważmy następujący fragment kodu zmniejszone o rodzimych bitset
klasy, która została opracowującym właściwie od czasów cudownych Clang 3.3 (prawie 2 lat!)Constexpr jest niedozwolone w ogłoszeniu o specjalizacji szablonu przyjaciela?
#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 na Wandbox. Jednakże, g ++ - 5.1 i obecny uwolnienie bagażnik daje błąd:
'constexpr' is not allowed in declaration of friend template specialization
Pytanie: jest to znany bug lub g ++ jest Clang nie zgodny z najnowszym standardem?
Uwaga: powyżej wykorzystuje tylko C++ 11 stylem constexpr
możliwości, ponieważ nie istnieją żadne zmiany zachodzące wewnątrz operator==
, więc wydaje się trochę dziwne zakłócenia między szablonami, przyjaciół i constexpr.
UPDATE: złożony jako bug 65977 na Bugzilli.
I 4.8.2 narzeka na [nieistotny specyfikator 'inline'] (http://melpon.org/wandbox/permlink/ZNUj29hUVVn5RgJr) ... – Columbo
Nie widzę żadnych oczywistych odpowiedzi na to, może być pomocne w otworzeniu raportu o błędzie gcc, zwłaszcza, że jest to różnica w implementacji między clangiem i gcc. Nie widzę żadnych wad, które się z tym wiążą i chociaż odpowiedź Marco jest prawdopodobnie poprawna, nie jest to oczywiście dla mnie poprawne. –
Osobiście zostawiłbym nagrodę w miejscu, więc odpowiedź mogłaby otrzymać więcej głosów na głos. To idealna odpowiedź i zasługuje na więcej niż 2 głosy. –