Size: a a a

2020 July 29

D

Danya in supapro.cxx
Denis Paukaev
struct S {
   static const int foo{};
};

constexpr auto k = S::foo;


как же ты их интересно собрался различать )
Не очень понятно что ты имеешь в виду
источник

DP

Denis Paukaev in supapro.cxx
Danya
Не очень понятно что ты имеешь в виду
Что constexpr не отличить от const?
источник

D

Danya in supapro.cxx
Danya
Я пишу концепты
И мне надо проверить что у типа есть static constexpr member variable типа bool
Есть какие-нибудь красивые способы это проверить?
А то пока у меня приходят в голову не самый красивые варианты
1) Написать: concept ... = (T::foo || !T::foo)
2) Написать dummy шаблон
template <typename T, T value>
constexpr bool is_constexpr_expr = true;
...
concept ... = is_constexpr_expr<bool, T::foo>;
Пришёл к такому решению:
template <auto>
   concept constant_expression = true;
Использование:
concept ... = constant_expression<T::foo>
источник

D

Danya in supapro.cxx
Denis Paukaev
Что constexpr не отличить от const?
Мне достаточно того, что это константа этапа компиляции
источник

D

Danya in supapro.cxx
Danya
Пришёл к такому решению:
template <auto>
   concept constant_expression = true;
Использование:
concept ... = constant_expression<T::foo>
Насколько я знаю, что если в описации концепта не в requires написать ill-formed выражение, то оно вернёт false просто
источник

D

Danya in supapro.cxx
Да даже если грохнется компиляция, то тоже норм
источник

D

Danya in supapro.cxx
https://godbolt.org/z/boqvbz
Почему на 30 строке берётся перегрузка с requires?
источник

D

Danya in supapro.cxx
Тип если инлайн статик переменная инициализируется константным выражением, то она сама становится константным выражением?
источник

АК

Александр Караев... in supapro.cxx
Danya
Тип если инлайн статик переменная инициализируется константным выражением, то она сама становится константным выражением?
static_assert(compile_time_foo<FooWithNonConstant>); не фейлится
источник

D

Danya in supapro.cxx
Александр Караев
static_assert(compile_time_foo<FooWithNonConstant>); не фейлится
Я это понимаю, почему?
источник

D

Danya in supapro.cxx
По идее должен же
источник

D

Danya in supapro.cxx
FooWithNonConstant::bar не константное выражение же
источник

D

Danya in supapro.cxx
По идее..
источник

АК

Александр Караев... in supapro.cxx
template <auto Value>
concept constant_expression = (std::integral_constant<decltype(Value), Value>{}, true);
источник

АК

Александр Караев... in supapro.cxx
а вот почему - хз, вероятно компилятор видит always-true концепт и ему этого хватает
источник

D

Danya in supapro.cxx
Александр Караев
а вот почему - хз, вероятно компилятор видит always-true концепт и ему этого хватает
Го репортить багу в MSVC или GCC?)))
https://godbolt.org/z/EMG9sE
источник

АК

Александр Караев... in supapro.cxx
https://godbolt.org/z/r1bGPv
вот так проще смотреть
источник

АК

Александр Караев... in supapro.cxx
как по стандарту - не знаю, но я бы сказал, что гцц не прав
источник

АК

Александр Караев... in supapro.cxx
Александр Караев
template <auto Value>
concept constant_expression = (std::integral_constant<decltype(Value), Value>{}, true);
вот так работают все
источник

D

Danya in supapro.cxx
Александр Караев
как по стандарту - не знаю, но я бы сказал, что гцц не прав
У кланга поведение как у MSVC
источник