Re: концептуальный wish you happy debug
От: F3V  
Дата: 08.11.24 02:13
Оценка: 43 (2)
Здравствуйте, Кодт, Вы писали:

К>До того, как всё сломалось, — всё работало: https://gcc.godbolt.org/z/dPPE6KrYe


К>Попробуйте догадаться, в чём дело.

К>А если догадаетесь, то попробуйте написать минималистичный wish-you-happy-debug

Подглядел отгадку, т.к. с новыми стандартами ещё не знаком.

Если правильно понял мысль, где двое, там и трое соберутся:

#include <iostream>

struct A {};  // fable
struct B {};  // non-fable
struct C {};  // wtf

template<class T, int I = __LINE__> concept fable1 = requires(const T & t) { f(t); I; };
#define FABLE(_class) fable1<_class, __LINE__>

template<class T, int I = __LINE__> void g() {
    if constexpr (fable1<T,I>) {
        std::cout << I << ": " << typeid(T).name() << " fable" << std::endl;
    } else {
        std::cout << I << ": " << typeid(T).name() << " non-fable" << std::endl;
    }
}

void f(A) {}                // fable

static_assert(!FABLE(C));   // LINE 20!

void f(C) {}                // fable ???

static_assert( FABLE(A));
static_assert(!FABLE(B));
static_assert( FABLE(C));   // LINE 26!

int main() {
    g<A>();     // fable
    g<B>();     // non-fable
    g<C, 20>(); // non-fable  LINE 20
    g<C, 26>(); // fable      LINE 26
    g<C>();     // fable
}


https://gcc.godbolt.org/z/359Kdne8z

Но если убрать там I; то на gcc перестанет компилироваться, хотя студия и clang соберут без ошибок.

Интересно, который из них прав будет?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.