ideas icon indicating copy to clipboard operation
ideas copied to clipboard

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

Open XRay3D opened this issue 2 years ago • 4 comments

Разрешить 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});

XRay3D avatar Jan 19 '22 12:01 XRay3D

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

apolukhin avatar Jan 19 '22 19:01 apolukhin

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

kelbon avatar Jan 20 '22 07:01 kelbon

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

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

Izaron avatar Feb 06 '22 22:02 Izaron

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

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

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

XRay3D avatar Feb 08 '22 06:02 XRay3D