концептуальный wish you happy debug
От: Кодт Россия  
Дата: 07.11.24 10:38
Оценка: 39 (2) +1 :)
Маленькая глупенькая загадка-вотзефак. Не из рабочего кода, к счастью, но, как говорится, был близок к тому

Представьте себе, что у вас в коде есть функция 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
Перекуём баги на фичи!
Отредактировано 07.11.2024 10:49 Кодт . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.