Size: a a a

2020 August 16

VF

Vitaly Farmov in pro.cxx
Alex
ну, кстати, сейчас подумаю, решает ли шаблонная лямбда эту задачу.
А был бы шаблонизирован - не было бы ошибки компиляции. Которая была, и я убил на неё полдня.
можно просто написать auto в аргументе лямбды, вот тебе и шаблон, но без шаблона
источник

VF

Vitaly Farmov in pro.cxx
Alex
В реальном коде это было внутри лямбды, которая коллбэк, что-то типа визитора, и эта лямбда вызывалась с совершенно разными типами, из которых мне нужно было отпилить то, что мне не интересно и компилиться не должно. Шаблонизировать этот контекст можно только искусственным раздуванием кода.
источник

VF

Vitaly Farmov in pro.cxx
Кстати, clang ни в какую не хочет такое сжевывать
https://godbolt.org/z/3MefPn
источник

A

Alex in pro.cxx
Vitaly Farmov
можно просто написать auto в аргументе лямбды, вот тебе и шаблон, но без шаблона
Она и была auto
источник

O

Ofee in pro.cxx
Потому что параметры constexpr-функций не являются constexpr-переменными, нужно, наверное, так: std::remove_cvref_t<decltype(first)>::isArray()
источник

A

Alex in pro.cxx
Ofee
Потому что параметры constexpr-функций не являются constexpr-переменными, нужно, наверное, так: std::remove_cvref_t<decltype(first)>::isArray()
Не являются, но по желанию левой пятки компилятора могут успешно использоваться в constexpr контексте, а могут и нет. Кстати, если кто-то объяснит, по какому закону это решается, буду признателен.
источник

O

Ofee in pro.cxx
Alex
Не являются, но по желанию левой пятки компилятора могут успешно использоваться в constexpr контексте, а могут и нет. Кстати, если кто-то объяснит, по какому закону это решается, буду признателен.
Мне кажется, это лишь свобода компиляторов в трактовке стандарта, я бы не полагался на то, что это возможно
источник

A

Alex in pro.cxx
У меня накопилось много строк когда, которые на это полагаются и компилятся всеми тремя компиляторами. Но да, сопливо.
источник

VF

Vitaly Farmov in pro.cxx
Ofee
Потому что параметры constexpr-функций не являются constexpr-переменными, нужно, наверное, так: std::remove_cvref_t<decltype(first)>::isArray()
ну да, так логичнее, а то текущая имплементация больше про концепты, наверное
источник

AT

Alexander T in pro.cxx
Да, и не должна, потому что constexpr должен протащиться по всей цепочке. Если добавить в Poly и в лямбду constexpr, то взлетает:
https://godbolt.org/z/1sd7ob
Правда, почему-то не может сожрать аргументы-ссылки, выглядит реально как баг. Если заменить на значения, то работает.
источник

A

Alex in pro.cxx
а ссылки вообще должны работать в constexpr контексте?
источник

AT

Alexander T in pro.cxx
https://en.cppreference.com/w/cpp/language/constexpr
Reference variables can be declared constexpr (their initializers have to be reference constant expressions):
Что-то новенькое для меня 🤔
источник

AT

Alexander T in pro.cxx
Серьёзно, это получается, constexpr-функция не может иметь в сигнатуре ссылочные аргументы что ли?
источник

VF

Vitaly Farmov in pro.cxx
Так а разве у Poly не должен в contexpr контексте быть вызван constexpr конструктор без явного указания constexpr? Я где-то читал про это в стандарте, но найти не могу
источник

VF

Vitaly Farmov in pro.cxx
потому что все работает, даже если просто убрать ссылочные типы: https://godbolt.org/z/seGePP
источник

A

Alex in pro.cxx
Vitaly Farmov
Так а разве у Poly не должен в contexpr контексте быть вызван constexpr конструктор без явного указания constexpr? Я где-то читал про это в стандарте, но найти не могу
Я не встречал такого, что constexpr атрибут конструктора может выводиться автоматом, есть такое правило для noexcept. Да и не может std::vector быть constexpr, по-моему (в С++17 точно не мог).
источник

VF

Vitaly Farmov in pro.cxx
Alex
Я не встречал такого, что constexpr атрибут конструктора может выводиться автоматом, есть такое правило для noexcept. Да и не может std::vector быть constexpr, по-моему (в С++17 точно не мог).
А я там на array заменил)
источник

A

Alex in pro.cxx
А, тогда всё возможно)
я считаю, что даже если статический метод вызывается на инстансе (с использованием нестатического синтаксиса), это не должно ни на что влиять. Но стандарт может быть другого мнения.
источник

VF

Vitaly Farmov in pro.cxx
Alex
Я не встречал такого, что constexpr атрибут конструктора может выводиться автоматом, есть такое правило для noexcept. Да и не может std::vector быть constexpr, по-моему (в С++17 точно не мог).
Интересно, что GCC с c++17 такое компилит (с вектором вместо эррэя), единственный:
https://godbolt.org/z/qbTT6c
источник

A

Alex in pro.cxx
Видимо, они ещё тогда поддержали constexpr для вектора, что, наверное, не запрещено стандартом
источник