我正在将一个使用C++14-constexpr
的代码库从Clang迁移到最新的g++-5.1。考虑到下面这个简化的代码片段,它是一个自制的bitset
类,自从Clang 3.3时代以来一直能够正确编译(已经接近两年了!)
#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和当前的trunk版本会报错:
'constexpr'在友元模板特化程序的声明中不允许
问题:这是已知的g++ bug还是Clang没有遵守最新标准?
注意:以上仅使用C++11风格的constexpr
特性,因为在operator==
内部没有进行任何修改,所以似乎是模板、友元和constexpr
之间的一些奇怪干扰。
更新:已经在Bugzilla上作为bug 65977报告了。