I tried to forward-declare a constexpr
variable template like this:
template<typename>
constexpr std::size_t iterator_category_value;
The goal was to document that every specialization should be constexpr
but I have to admit that I never checked whether it was legal or not and g++ was happy with it. However, when I tried to compile this spinnet with clang++ instead, I got the following error:
error: default initialization of an object of const type 'const std::size_t' (aka 'const unsigned long')
constexpr std::size_t iterator_category_value;
^
= 0
The error makes sense, and removing constexpr
makes it disappear, so that's not a real problem. However, I am curious now: does the standard allow such a constexpr
forward declaration for a variable template or is it illegal? g++ and clang++ seem to disagree and I would like to know where I should submit a bug report if needed.
Both of them complain for a forward-declared constepxr
variable which is not a variable template, so the variable template context seems to be what makes the compilers disagree.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…