Здравствуйте, Кодт, Вы писали:
К>До того, как всё сломалось, — всё работало: 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 соберут без ошибок.
Интересно, который из них прав будет?