For this code:
struct S
{
S(int m): m(m) {}
constexpr int f() const { return m; }
int m;
};
int main() { S s(1); }
it is compiled with no warnings or errors by clang 3.6, 3.7 and 3.8 with -std=c++14
. But in g++ 5.x the following errors occur:
main.cpp:4:19: error: enclosing class of constexpr non-static member function 'int S::f() const' is not a literal type
constexpr int f() const { return m; }
^
main.cpp:1:8: note: 'S' is not literal because:
struct S
^
main.cpp:1:8: note: 'S' is not an aggregate, does not have a trivial default constructor, and has no constexpr constructor that is not a copy or move constructor
Which compiler is correct and why?
I looked at the requirements in C++14 [dcl.constexpr]/3 which says that for a constexpr
function "each of its parameter types shall be a literal type", but that section does not explicitly mention member functions, and does not say whether the implied *this
counts as a parameter for the purposes of this clause.