Информация об изменениях

Сообщение Re[2]: концептуальный wish you happy debug от 08.11.2024 10:10

Изменено 08.11.2024 10:27 Кодт

Re[2]: концептуальный wish you happy debug
Здравствуйте, 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>Интересно, который из них прав будет?


Надо послать багрепорт гусю, и пусть обосновывают!
Re[2]: концептуальный wish you happy debug
Здравствуйте, 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.

Диагностика не требуется, но позволительна