Size: a a a

2020 November 28

VS

Vlad Serebrennikov in pro.cxx
magras
> We propose that at minimum the following operations be specified as implicitly creating objects:
> * Creation of an array of char, unsigned char, or std::byte implicitly creates objects within that array.

Таки должно работать с обычными массивами. Если что это из [P0593R6].
в стандарте оно вот здесь
источник

AT

Aleksey T in pro.cxx
книга "Решение задач на современном C++" нужна кому-нибудь? на русском.  pdf
источник

В

Всеволод in pro.cxx
источник

С

Сергей in pro.cxx
Aleksey T
книга "Решение задач на современном C++" нужна кому-нибудь? на русском.  pdf
Бансила? 2020 год?(второе издание)?
источник

AT

Aleksey T in pro.cxx
Бансила, но она 19г а не 20
источник

С

Сергей in pro.cxx
Сергей
Бансила? 2020 год?(второе издание)?
источник

ПК

Побитый Кирпич... in pro.cxx
Aleksey T
книга "Решение задач на современном C++" нужна кому-нибудь? на русском.  pdf
кинь всем в канал с книгами
источник

ПК

Побитый Кирпич... in pro.cxx
админам напиши
источник

O

Ofee in pro.cxx
Предположим, есть такой код, в котором foo1 и foo2 являются пользовательскими функциями, а всё остальное — библиотечное. Сейчас код не компилируется из-за того, что пользователь написал sfinae-unfriendly foo1

Способы заставить код компилироваться:
1) пользователь просто убирает вычисление noexcept
2) пользователь пишет foo1 правильно
3) мы со стороны библиотеки переписываем bar так, чтобы исключить вызов foo1 при возможности вызвать foo2

Должен ли я как разработчик библиотеки предпочесть третий вариант решения? Или же написание корректного кода должно быть ответственностью пользователя? Ведь третье решение скрывает проблему, а не решает её
источник

VS

Vlad Serebrennikov in pro.cxx
Ofee
Предположим, есть такой код, в котором foo1 и foo2 являются пользовательскими функциями, а всё остальное — библиотечное. Сейчас код не компилируется из-за того, что пользователь написал sfinae-unfriendly foo1

Способы заставить код компилироваться:
1) пользователь просто убирает вычисление noexcept
2) пользователь пишет foo1 правильно
3) мы со стороны библиотеки переписываем bar так, чтобы исключить вызов foo1 при возможности вызвать foo2

Должен ли я как разработчик библиотеки предпочесть третий вариант решения? Или же написание корректного кода должно быть ответственностью пользователя? Ведь третье решение скрывает проблему, а не решает её
я правильно понимаю, что foo1 вызывается не потому, что bar_impl(double) выбран, а как часть процесса разрешения перегрузки/инстанциации шаблона?
источник

O

Ofee in pro.cxx
Vlad Serebrennikov
я правильно понимаю, что foo1 вызывается не потому, что bar_impl(double) выбран, а как часть процесса разрешения перегрузки/инстанциации шаблона?
Да, именно так
источник

VS

Vlad Serebrennikov in pro.cxx
Ofee
Предположим, есть такой код, в котором foo1 и foo2 являются пользовательскими функциями, а всё остальное — библиотечное. Сейчас код не компилируется из-за того, что пользователь написал sfinae-unfriendly foo1

Способы заставить код компилироваться:
1) пользователь просто убирает вычисление noexcept
2) пользователь пишет foo1 правильно
3) мы со стороны библиотеки переписываем bar так, чтобы исключить вызов foo1 при возможности вызвать foo2

Должен ли я как разработчик библиотеки предпочесть третий вариант решения? Или же написание корректного кода должно быть ответственностью пользователя? Ведь третье решение скрывает проблему, а не решает её
мне кажется, что запрещать пользователю вычислять noexcept это плохой вариант, потому что не могу придумать случай, когда такой контракт будет разумен

третий вариант выглядит как эмуляция SFINAE вне контекста перегрузки. это, наверное, может иметь смысл в каких-то случаях, но не проще ли тогда на нормальную перегрузку перейти?
источник

VS

Vlad Serebrennikov in pro.cxx
с другой стороны, есть впечатление, что в текущей реализации SFINAE это именно то поведение, которого хочется
источник

O

Ofee in pro.cxx
Vlad Serebrennikov
мне кажется, что запрещать пользователю вычислять noexcept это плохой вариант, потому что не могу придумать случай, когда такой контракт будет разумен

третий вариант выглядит как эмуляция SFINAE вне контекста перегрузки. это, наверное, может иметь смысл в каких-то случаях, но не проще ли тогда на нормальную перегрузку перейти?
Дело в том, что проблема пользователя не в вычислении noexcept, а в том, что он написал функцию, которая вне sfinae-контекста делает что-то с заранее неизвестным типом, и это стреляет в ногу таким странным образом.

Более правильным решением со стороны пользователя было бы сделать вызов foo1 ill-formed в sfinae-контексте (например, взять второй мой вариант решения или повесить концепт на Fn). Т.е. правильным контрактом было бы требовать от пользователя предоставлять sfinae-friendly реализации функции

На нормальную перегрузку перейти не получится, ибо это минимально-воспроизводимый пример, в оригинале одна foo, имеющая две перегрузки с разными тегами и весь набор шаблонной магии, включая очень глубокие рекурсии
источник

O

Ofee in pro.cxx
Vlad Serebrennikov
с другой стороны, есть впечатление, что в текущей реализации SFINAE это именно то поведение, которого хочется
Ну, мне кажется, что для пользователя это максимально не ожидаемое поведение:
* мы предоставили foo2
* foo1 нигде не должна вызываться
* но почему-то компиляция падает

Но и со стороны библиотеки всё корректно реализовано, а попытка сделать так, чтобы у пользователя всё хорошо работало может привести  тому что, пользователь даже не узнает, что сделал что-то совершенно некорректное, просто foo1 будет лежать мёртвым, невалидным грузом в кодовой базе
источник

VS

Vlad Serebrennikov in pro.cxx
Ofee
Ну, мне кажется, что для пользователя это максимально не ожидаемое поведение:
* мы предоставили foo2
* foo1 нигде не должна вызываться
* но почему-то компиляция падает

Но и со стороны библиотеки всё корректно реализовано, а попытка сделать так, чтобы у пользователя всё хорошо работало может привести  тому что, пользователь даже не узнает, что сделал что-то совершенно некорректное, просто foo1 будет лежать мёртвым, невалидным грузом в кодовой базе
то есть вам действительно нужно SFINAE. тогда незачем идти вторым путем и ужесточать контракт, когда его нарушение выливается в длиннющие непонятные ошибки компиляции
источник

VS

Vlad Serebrennikov in pro.cxx
Ofee
Ну, мне кажется, что для пользователя это максимально не ожидаемое поведение:
* мы предоставили foo2
* foo1 нигде не должна вызываться
* но почему-то компиляция падает

Но и со стороны библиотеки всё корректно реализовано, а попытка сделать так, чтобы у пользователя всё хорошо работало может привести  тому что, пользователь даже не узнает, что сделал что-то совершенно некорректное, просто foo1 будет лежать мёртвым, невалидным грузом в кодовой базе
что касается контраргументов, которые вы привели в конце, то а) библиотеки ценны не корректной реализацией, а хорошими интерфейсами и контрактами, в том числе сообщениями об их нарушении; б) мертвый груз отброшенных шаблонов и тихие ошибки это непременные спутники SFINAE, поэтому я бы не записывал их в недостатки конкретно третьего решения
источник

O

Ofee in pro.cxx
Vlad Serebrennikov
что касается контраргументов, которые вы привели в конце, то а) библиотеки ценны не корректной реализацией, а хорошими интерфейсами и контрактами, в том числе сообщениями об их нарушении; б) мертвый груз отброшенных шаблонов и тихие ошибки это непременные спутники SFINAE, поэтому я бы не записывал их в недостатки конкретно третьего решения
Хм, спасибо, я понял и мне кажется ваша аргументация убедительной. Полагаю, если больше никто не укажет какие-либо интересные (контр)аргументы, то я выберу именно третий вариант
источник

m

magras in pro.cxx
Ofee
Предположим, есть такой код, в котором foo1 и foo2 являются пользовательскими функциями, а всё остальное — библиотечное. Сейчас код не компилируется из-за того, что пользователь написал sfinae-unfriendly foo1

Способы заставить код компилироваться:
1) пользователь просто убирает вычисление noexcept
2) пользователь пишет foo1 правильно
3) мы со стороны библиотеки переписываем bar так, чтобы исключить вызов foo1 при возможности вызвать foo2

Должен ли я как разработчик библиотеки предпочесть третий вариант решения? Или же написание корректного кода должно быть ответственностью пользователя? Ведь третье решение скрывает проблему, а не решает её
А нужен ли trail type в bar_impl? Если использовать просто вывод типа через auto оно собирается.
источник

m

magras in pro.cxx
Вообще изначально я думал добавить static_assert, чтобы выдать пользователю вменяемое сообщение об ошибке.
источник