constexpr non-static member function with non-constexpr constructor (gcc,clang differ)

一笑奈何 提交于 2020-01-03 08:09:07

问题


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.


回答1:


It's a core defect that was fixed for C++14

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1684

Clang was patched

https://groups.google.com/a/isocpp.org/forum/#!topic/std-discussion/6jM8M8FUs30

There's a tracker for GCC but it doesn't look like anyone has addressed it yet

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66297



来源:https://stackoverflow.com/questions/36489369/constexpr-non-static-member-function-with-non-constexpr-constructor-gcc-clang-d

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!