Маленькая глупенькая загадка-вотзефак. Не из рабочего кода, к счастью, но, как говорится, был близок к тому
Представьте себе, что у вас в коде есть функция f(x) и концепт fable, отвечающий на вопрос — можно ли подставить этот тип в f.
Но этот концепт работает... как-то странно!
Поэтому сделаем два одинаковых концепта — просто скопипастим их.
И даже напишем функцию, которая проверяет их оба.
До того, как всё сломалось, — всё работало:
https://gcc.godbolt.org/z/dPPE6KrYe
А потом что-то сломалось.
#include <iostream>
template<class T> concept fable1 = requires(const T& t) { f(t); };
template<class T> concept fable2 = requires(const T& t) { f(t); };
template<class T> void g() {
if constexpr (fable1<T>) {
std::cout << "fable" << std::endl;
} else if constexpr (fable2<T>) {
std::cout << "wtf" << std::endl;
} else {
std::cout << "non-fable" << std::endl;
}
}
struct A{}; // fable
struct B{}; // non-fable
struct C{}; // wtf
.....
void f(A) {} // fable
void f(C) {} // fable ???
static_assert( fable1<A> && fable2<A>);
static_assert(!fable1<B> && !fable2<B>);
static_assert( fable1<C> != fable2<C>);
int main() {
g<A>(); // fable
g<B>(); // non-fable
g<C>(); // wtf
}
Попробуйте догадаться, в чём дело.
А если догадаетесь, то попробуйте написать минималистичный wish-you-happy-debug
Отгадка
| (.....) |
| static_assert(!fable1<C>);
|
| |
Вот так вот!
https://gcc.godbolt.org/z/jorvdj7MY