Здравствуйте, F3V, Вы писали:
F3V>Подглядел отгадку, т.к. с новыми стандартами ещё не знаком.
Этот фокус можно и без концептов провернуть. Проблема в точке инстанцирования шаблона (в данном случае — булевой константы со специальным синтаксисом и специальной семантикой).
auto f1(auto x) { return f(x); }
auto f2(auto x) { return f(x); }
char f(auto) { return 0; }
struct A {};
static_assert(sizeof(f1(A{})) == 1); // инстанцировали f1 здесь (где видна только char f)
int f(A) { return 0; }
static_assert(sizeof(f1(A{})) == 1);
static_assert(sizeof(f2(A{})) == sizeof(int)); // инстанцировали f2 здесь
F3V>Если правильно понял мысль, где двое, там и трое соберутся:
по поводу __LINE__: оно там в паре мест не по делу. Но это не влияет.
F3V>template<class T, int I = __LINE__ /* = 7 */> concept fable1 = requires(const T & t) { f(t); I; };
F3V>template<class T, int I = __LINE__ /* = 10 */> void g() {
F3V>Но если убрать там I; то на gcc перестанет компилироваться, хотя студия и clang соберут без ошибок.
Гусь кеширует значения requires
и проверяет, что они изменились.
Минимизировал пример
https://gcc.godbolt.org/z/3xha35EWq
<source>:1:40: error: satisfaction value of atomic constraint 'requires(T t) {f(t);} [with T = A]' changed from 'false' to 'true'
F3V>Интересно, который из них прав будет?
https://timsong-cpp.github.io/cppwp/temp.constr.constr#temp.constr.atomic-3.sentence-5
If, at different points in the program, the satisfaction result is different for identical atomic constraints and template arguments, the program is ill-formed, no diagnostic required.
Диагностика не требуется, но позволительна