Как удалить `constexpr` из типа переменной - PullRequest
0 голосов
/ 15 апреля 2020

Constexpr представляется частью типа переменной (полученной через decltype(...)), так как следующее утверждение не выполняется:

constexpr int variable {};
static_assert(std::is_same_v<int, std::remove_cvref<std::decay<decltype(variable)>>>);

Есть ли в стандартной библиотеке вспомогательная структура, которую я могу использовать на второй аргумент is_same_v, чтобы сделать утверждение true? В настоящее время я использую следующий обходной путь, который я хотел бы заменить на правильное решение:

template <typename T> T func();
static_assert(std::is_same_v<int, decltype(func<decltype(variable)>())>);

Код доступен здесь ; Я использую это для ограничения автоматически выводимого типа параметра шаблона нетипичного типа.

1 Ответ

0 голосов
/ 15 апреля 2020

constexpr только изменяет тип переменной на const, поэтому, например, std::remove_cvref_t<...> может использоваться для "исправления" утверждения. Таким образом, следующие статические утверждения c компилируются:

static_assert(std::is_same_v<int const, decltype(variable)>);
static_assert(std::is_same_v<int, std::remove_cv_t<decltype(variable)>>);

Из-за опечатки аргумент в утверждении вопроса неверно сравнивает тип структуры remove_cvref с int как суффиксом _t (псевдоним remove_cvref<...>::type) отсутствует. Этот тип отличается от int, что приводит к сбою static_assertion.

...