https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93705
Bug ID: 93705
Summary: [C++2a] Non-type literal class template-parameter
types with mutable data members should not be allowed
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: kevin at hart dot mn
Target Milestone: ---
In the current implementation of C++2a, otherwise structural class types with
mutable data members are allowed as non-type template parameters.
The following sources seem to indicate that these should be rejected:
https://github.com/cplusplus/draft/blob/0354125f1cdfef949d80053528c4a1a4f74b1dea/source/templates.tex#L396
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1907r1.html
Perhaps non-const member functions should cause rejection as well? I couldn't
find anything about this.
Example:
struct Literal {
constexpr Literal() {}
// This is allowed (not const), but perhaps shouldn't be.
bool has_value = false;
};
template
void Test() {
// The below will fail if uncommented, but seems different
// from the language of the spec.
// error: assignment of member 'Literal::has_value' in read-only object
// lit.has_value = true;
}
int main()
{
Test();
}