Anatoliy
не знаю ситуации с noexcept
Constantine
вы видели noexcept парадокс лжеца?
Constantine
struct A { struct B { int i = (A(), 0); }; A() noexcept(!noexcept(B())); };
Anatoliy
decltype(sizeof(хоть что)) может быть только одним и тем же типом
Anatoliy
что за проблема?
Anatoliy
каким он ещё может быть типом?))
Anatoliy
в правой части A - это complete или уже нет?
Constantine
это вы определитесь
Constantine
вы auto в описание класса предлагаете
Constantine
сейчас - complete
Igor
нет, не может
... return a constant of type std::size_t. не?
Anatoliy
даже если incomplete, то что страшного, когда sizeof(decltype(sizeof(хоть что, даже incomplete tpe))) - это константа?
Anatoliy
запретить struct A { int i = j; int j = 0; }; и дело в шляпе
Igor
даже если incomplete, то что страшного, когда sizeof(decltype(sizeof(хоть что, даже incomplete tpe))) - это константа?
sizeof от incomplete type даёт ошибку компиляции же, даже внутри decltype, или предлагается это исправить?
Anatoliy
Мне-то очевидно, что это реализуемо. И я уже прочитал, какие на самом деле проблемы это предположительно могло бы вызвать (но уже считается, что этого всего зря боялись). Мне просто интересно, когда примут это в стандарт.
Constantine
... return a constant of type std::size_t. не?
это в случае compelete type
Anatoliy
надо чтобы decltype(sizeof(incomplete)) был well defined
Anatoliy
вот и всё
Constantine
Анатолий, вы пользовались когда-нибудь is_detected?
Anatoliy
не припоминаю, ув. Константин
Constantine
ну вот видимо поэтому вы не знаете, СКОЛЬКО проблем может создавать decltype с incomplete параметрами)
Anatoliy
в явном виде - вряд ли, но может сам навилосипедил, когда что-то хитрое писал
Anatoliy
проблем какого рода?
Constantine
ODR violation
Matwey
Вот decltype() для меня не до конца понятен, что туда можно писать, а что туда нельзя писать
Constantine
через decltype инстанцирования в SFINAE
Anatoliy
через decltype инстанцирования в SFINAE
пока для меня не очевидно, что могут быть хоть какие-то проблемы, но тема действительно может быть запутанной
Constantine
пока для меня не очевидно, что могут быть хоть какие-то проблемы, но тема действительно может быть запутанной
представьте, что некоторый шаблон начинает (через ADL в случае two phase name lookup) выполнять поиск перегрузки при инстанцировании
Constantine
представьте, что эти перегрузки возвращают разные типы
Constantine
представьте, что возвращаемое значение функции зависит от выбранной перегрузки
Constantine
все, собственно
Anatoliy
шаблон класса?
Constantine
да не важно
Constantine
template <typename T1, typename T2> auto f(T1 & t1, T2 & t2) -> decltype(swap(std::declval<T1&>(), std::declval<T2&>())) { return swap(t1, t2); }
Anatoliy
вы описали что-то обычное. ни за какие предполагаемые внутренние противоречия мой мысленный взор не зацепился
Nikita
ребят, а если мой класс удовлетворяет концепту Swappable , то std::swap вызовет мой swap?
Nikita
или мне нужно std::swap отдельно специализировать?
Constantine
нет
Anatoliy
тебе надо на ADL положиться
Constantine
сейчас, я пытаюсь понять, как мне это вычислять
RattenKong 🦧🐀🦍️
А кто нибудь юзает bazel? Из него шибко больно вытягивать солюшены и мейкфайлы для скармливания иде?
Constantine
вообще красота. Много раз такое видел
угу, а теперь decltype(f(std::declval<IncompleteType1&>, std::declval<IncompleteType2&>))
Nikita
нет
нет - не вызовет?
Alexander "SonnySlave"
а что надо? лабу сделать?
Constantine
Nikita
спасибо
Constantine
меня так прикалывает студентота, блин, по их мнению когда им нужна помощь с лабой им нужен кто-то кто ХОРОШО разбирается
Constantine
а на самом деле наоборот
Constantine
вообще красота. Много раз такое видел
короче идея в том, что инстанцирование чего-то, чей вычисляемый тип зависит от выбранной перегрузки, по incomplete type просто убьет ногу
Anatoliy
ну значит там должна быть hard error
Constantine
потому что нужная перегрузка будет написана вместе с описанием типа
Constantine
там будет ODR violation
Constantine
а он нормально не детектируется
Constantine
просто из-за decltype чего-то, содержащего declval<IncompleteType>
Constantine
я, честно говоря, полагаю, что это одна из причин, по которой is_detected до сих пор в experimental
Constantine
поскольку совершенно очевидно, что в синтаксисе struct A { auto x = /*something containing A*/ }; в действительности невозможно считать, что A это complete type, придется детектировать, причем как-то очень жестко
Vitaliy
Всем привет. Подскажите хорошую реализацию pimpl, может либу в которой он есть.
Anatoliy
ни одной чтуки, которая ODR-used в ваших выкладках я не заметил
Vitaliy
а что значит хорошую? 😊
Например, эта реализация должна решать проблемы с константностью
Constantine
ни одной чтуки, которая ODR-used в ваших выкладках я не заметил
name lookup from within each definition finds the same entities (after overload-resolution), except that constants with internal or no linkage may refer to different objects as long as they are not ODR-used and have the same values in every definition.
Александр
есть, это чудо из two phase name lookup
я догадывался, но связь между наличием неймспейса и проблемой не смог уловить
Constantine
в первом случае выполняется ADL
Constantine
который выполняется в точке инстанцирования
Constantine
во втором не выполняется ADL, а все, что не ADL, выполняется по точке объявления
Constantine
это суть two phase name lookup
Constantine
тут недавно обсуждался очень похожий пример
Александр
во втором не выполняется ADL, а все, что не ADL, выполняется по точке объявления
то есть заставить работать has_do_it_v, оставив его реализацию в либе, не получится?
Constantine
если кратко, то в two phase name lookup нельзя делать customization point в namespace
Constantine
например, std::begin вызывается всегда просто как begin()
Constantine
template <typename T> decltype(auto) some_f(T & t) { using std::begin; return begin(t); }