cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

constexpr- и consteval-классы #479

Open Izaron opened 2 years ago

Izaron commented 2 years ago

Посмотрите на любую библиотеку, в которой showcase возможностей constexpr-а: frozen constexpr_all_the_things

Возникает стойкое ощущение, что классам/структурам не хватает объявления "пометь все мои функции как constexpr" или (начиная с С++20) "как consteval". Это может быть важно с модой на constexpr в последнее время.

Предлагаю иметь возможность объявлять constexpr- и consteval-классы, чтобы запись

constexpr class conststr {  // <<< пометка класса constexpr
    const char* p;
    std::size_t sz;
public:
    template<std::size_t N>
    conststr(const char(&a)[N]): p(a), sz(N - 1) {}

    char operator[](std::size_t n) const
    {
        return n < sz ? p[n] : throw std::out_of_range("");
    }
    std::size_t size() const { return sz; }
};

была эквивалентна

class conststr {
    const char* p;
    std::size_t sz;
public:
    template<std::size_t N>
    constexpr conststr(const char(&a)[N]): p(a), sz(N - 1) {} // <<< пометка метода constexpr

    constexpr char operator[](std::size_t n) const // <<< пометка метода constexpr
    {
        return n < sz ? p[n] : throw std::out_of_range("");
    }
    constexpr std::size_t size() const { return sz; } // <<< пометка метода constexpr
};

Аналогично можно ввести объявление consteval class conststr, которое будет семантически отличаться.

P. S. Надеюсь, эта идея не слишком очевидна, чтобы ее не предложил кто-то другой =)

sergii-rybin-tfs commented 2 years ago

Так же было бы удобно, что бы все методы класса по умолчанию были const.

Izaron commented 2 years ago

Предложено в апреле этого года: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2350r0.pdf