Привет, ЛОР!
Нашёл забавную фишку про C++. Если вкратце, можно сделать, чтобы следующий кусок кода не вываливался с ошибкой при сборке.
int main () {
constexpr int a = f ();
constexpr int b = f ();
static_assert (a != b, "fail");
}
Как это сделать? Об этом написано тут: https://b.atch.se/posts/non-constant-constant-expressions/
Если вкратце, то C++ стал настолько монструозен, что разные части стандарта могут прямо друг другу противоречить, и вместе эти фичи языка дают прямо таки неожиданные результаты. В итоге, можно сделать так, чтобы функция, помеченная как constexpr, на самом деле в каждом вызове выдавала рандомное значение в зависимости от фазы луны. Если очень хочется.
P.S. первый пример из ссылки GCC сейчас обрабатывает корректно и вываливает ошибку из static_assert. Но второй ещё работает в GCC 13. Для Ъ код ниже.
namespace detail {
struct A {
constexpr A () { }
friend constexpr int adl_flag (A);
};
template<class Tag>
struct writer {
friend constexpr int adl_flag (Tag) {
return 0;
}
};
}
template<class Tag, int = adl_flag (Tag {})>
constexpr bool is_flag_usable (int) {
return true;
}
template<class Tag>
constexpr bool is_flag_usable (...) {
return false;
}
template<bool B, class Tag = detail::A>
struct dependent_writer : detail::writer<Tag> { };
template<
class Tag = detail::A,
bool B = is_flag_usable<Tag> (0),
int = sizeof (dependent_writer<B>)
>
constexpr int f () {
return B;
}
int main () {
constexpr int a = f ();
constexpr int b = f ();
static_assert (a != b, "fail");
}