Я переношу кодовую базу С++ 14- constexpr
от Clang до последнего g++ - 5.1. Рассмотрим приведенный ниже фрагмент кода самодельного класса bitset
, который правильно компилируется с halcyon дней Clang 3.3 (почти через 2 года!)
#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() {}
Живой пример в Wandbox. Однако g++ - 5.1 и текущий выпуск соединительной линии дают ошибку:
'constexpr' не разрешено в объявлении шаблона друга специализации
Вопрос: это известная ошибка g++ или Clang не соответствует последнему стандарту?
Примечание. В приведенном выше примере используются только функции стиля С++ 11 style constexpr
, поскольку внутри operator==
не происходит никаких изменений, поэтому кажется, что некоторые странные помехи между шаблонами, друзьями и constexpr,
UPDATE: зарегистрирован как ошибка 65977 в Bugzilla.