ideas
ideas copied to clipboard
constexpr- и consteval-классы
Посмотрите на любую библиотеку, в которой 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. Надеюсь, эта идея не слишком очевидна, чтобы ее не предложил кто-то другой =)
Так же было бы удобно, что бы все методы класса по умолчанию были const.
Предложено в апреле этого года: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2350r0.pdf