ideas
ideas copied to clipboard
consteval для конструктора и CTAD
Разрешить 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});
Выглядит прикольно... А зачем такое на практике?
Хех, думал про такое в контексте name(string literal), но семантически мы конструируем один объект, а по факту конструируем как бы весь класс(статическое поле), что как то неправильно, плюс я не нашёл каких то годных применений кроме сокращения записи чуть чуть
В C++ он на самом деле разрешен (видимо по принципу "разрешено то, что не запрещено"), такой код работает https://godbolt.org/z/5o3xYMo51
Однако мешающих багов достаточно много. Такой набор у Clang - https://github.com/llvm/llvm-project/issues?q=is%3Aissue+consteval+is%3Aopen, у GCC/MSVC скорее всего тоже немаленький.
В C++ он на самом деле разрешен (видимо по принципу "разрешено то, что не запрещено"), такой код работает https://godbolt.org/z/5o3xYMo51
Однако мешающих багов достаточно много. Такой набор у Clang - https://github.com/llvm/llvm-project/issues?q=is%3Aissue+consteval+is%3Aopen, у GCC/MSVC скорее всего тоже немаленький.
Но таким образом не удается инициализировать constexpr поля.