cpp-ru / ideas

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

consteval для конструктора и CTAD #503

Open XRay3D opened 2 years ago

XRay3D commented 2 years ago

Разрешить consteval конструктор:

template <class Ty, Ty Val>
struct integral_constant {
    consteval integral_constant (Ty Val) {
        ...
    }
    ...
};

template <class Ty, Ty Val>
integral_constant(Ty Val) -> integral_constant<Ty, Val>;

struct bool_constant {
    static constexpr bool value;
    consteval bool_constant (bool Val = false) : value{Val} {
        ...
    }
    ...
};

Возможное использование:

constexpr auto thing{integral_constant(10ULL)};

void some_func(auto param) {
    ...
}
//вызов
some_func(integral_constant(123));
some_func(thing);
some_func(bool_constant{});
some_func(bool_constant{true});
apolukhin commented 2 years ago

Выглядит прикольно... А зачем такое на практике?

kelbon commented 2 years ago

Хех, думал про такое в контексте name(string literal), но семантически мы конструируем один объект, а по факту конструируем как бы весь класс(статическое поле), что как то неправильно, плюс я не нашёл каких то годных применений кроме сокращения записи чуть чуть

Izaron commented 2 years ago

В C++ он на самом деле разрешен (видимо по принципу "разрешено то, что не запрещено"), такой код работает https://godbolt.org/z/5o3xYMo51

Однако мешающих багов достаточно много. Такой набор у Clang - https://github.com/llvm/llvm-project/issues?q=is%3Aissue+consteval+is%3Aopen, у GCC/MSVC скорее всего тоже немаленький.

XRay3D commented 2 years ago

В C++ он на самом деле разрешен (видимо по принципу "разрешено то, что не запрещено"), такой код работает https://godbolt.org/z/5o3xYMo51

Однако мешающих багов достаточно много. Такой набор у Clang - https://github.com/llvm/llvm-project/issues?q=is%3Aissue+consteval+is%3Aopen, у GCC/MSVC скорее всего тоже немаленький.

Но таким образом не удается инициализировать constexpr поля.