What is the use of a constexpr on a non-const member function?

前端 未结 2 889
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-18 18:59

The accepted answer in literal class compile error with constexpr constructor and function (differ vc, g++) shows that in C++14 there is a difference in the way conste

相关标签:
2条回答
  • 2020-12-18 19:30

    Question: how do you create a constexpr array of size 1024 with all elements set to 0 except element element 42 which needs to be 11?

    #include <array>
    
    constexpr auto make_my_array() -> std::array<int, 1024>
    {
        std::array<int, 1024> a{};
        a[42] = 11; // std::array::operator[] is constexpr non-const method since C++17
    
        return a;
    }
    
    auto test()
    {
        constexpr std::array<int, 1024> a = make_my_array();
    }
    

    Or a better yet suggestion from @michael-anderson a make_iota_array:

    template <std::size_t N>
    constexpr auto make_iota_array() -> std::array<int, N>
    {
        std::array<int, N> a{};
    
        for (std::size_t i = 0; i < N; ++i)
            a[i] = i;
    
        return a;
    }
    
    0 讨论(0)
  • 2020-12-18 19:31

    constexpr means "can be used where a constant expression is required". The "implied const" for declared objects doesn't mean we can't have non-const objects in other contexts. For instance, a somewhat contrived example, created from your own:

    template<int>
    struct foo {
    };
    
    struct A {
        int i = 0;
        constexpr A() {}
        constexpr int a() { return i; }
        constexpr int b() const {return 12; }
        constexpr A&  c() { ++i; return *this; }
    };
    
    int main()
    {
        foo<A{}.c().a()> f1;
    }
    

    Obviously the template argument must be a constant expression. Now, A{} is a prvalue of a literal type with a constexpr c'tor, and it's a non-const object. The member function is allowed to modify this "constant" because the entire computation can collapse to a constant expression at compile time. That's the rationale for the rules, on one foot.

    0 讨论(0)
提交回复
热议问题