Size: a a a

2020 August 14

A

Alex in pro.cxx
Может, именно static_assert не должен работать, но всякие шаблоны работают
источник

A

Alex in pro.cxx
Andrei K
Да и кроме того, там у лямбды непустой захват, это тоже очевидно не может быть constexpr. Будь там I constexpr — его не надо было бы захватывать.
Какая связь? Захват - это про область видимости
источник

AK

Andrei K in pro.cxx
Связь такая, что constexpr не надо захватывать в лямбду.
источник

AK

Andrei K in pro.cxx
Если что-то требует захвата — оно по определению не constexpr
источник

АК

Александр Караев... in pro.cxx
Alex
Может, именно static_assert не должен работать, но всякие шаблоны работают
Без разницы.
источник

A

Alex in pro.cxx
Andrei K
Связь такая, что constexpr не надо захватывать в лямбду.
Что-то я вам не верю
источник

AK

Andrei K in pro.cxx
Alex
Что-то я вам не верю
источник

A

Alex in pro.cxx
Какой бред (я о правиле, а не о ролике)
источник

A

Alex in pro.cxx
Но суть в том, что у меня полно конструкций static_for с такими лямбдами, они все по [&] захватывают объявленные выше локальные объекты, и всё это успешно работает в компайл тайм в MSVC и GCC. Проблема возникла со вложенной такой же лямбдой.
источник

AK

Andrei K in pro.cxx
Да вроде логишно. constexpr variable doesn’t constitute odr-use, значит у такой штуки нет определения и не может быть адреса, значит и захватывать её не надо.
источник

AK

Andrei K in pro.cxx
Alex
Но суть в том, что у меня полно конструкций static_for с такими лямбдами, они все по [&] захватывают объявленные выше локальные объекты, и всё это успешно работает в компайл тайм в MSVC и GCC. Проблема возникла со вложенной такой же лямбдой.
Вложенная лямбда по идее определена внутри operator(), следовательно единственный способ ей что-то захватить — это захватить с родительской лямбды.
источник

AK

Andrei K in pro.cxx
[&] — это вообще моветон, как по мне.
источник

A

Alex in pro.cxx
Andrei K
Да вроде логишно. constexpr variable doesn’t constitute odr-use, значит у такой штуки нет определения и не может быть адреса, значит и захватывать её не надо.
это какое-то нарушение scope. Её захват, действительно, представляет собой ничего (никакое действие для этого не нужно), но нужно разрешение, чтобы её видеть
источник

A

Alex in pro.cxx
Andrei K
Вложенная лямбда по идее определена внутри operator(), следовательно единственный способ ей что-то захватить — это захватить с родительской лямбды.
Да, получается именно так. Но в чём проблема-то?
источник

A

Alex in pro.cxx
Вот моя проблема в дистиллированном виде: https://godbolt.org/z/591YW3
Не компилится только в MSVC. Без захвата тоже не компилится с соответствующей ошибкой, и тоже только в MSVC. Если заменить I на parameter - компилится (тоже только с захватом).
Пойду зарепорчу.
источник

SE

Stanislav Ershov in pro.cxx
Alex
Вот моя проблема в дистиллированном виде: https://godbolt.org/z/591YW3
Не компилится только в MSVC. Без захвата тоже не компилится с соответствующей ошибкой, и тоже только в MSVC. Если заменить I на parameter - компилится (тоже только с захватом).
Пойду зарепорчу.
если в  static_assert I заменить на parameter то все работает
источник

A

Alex in pro.cxx
да, именно, для того я его и добавил)
источник

A

Alex in pro.cxx
Зарепортил, кому не лень - проголосуйте, пожалуйста https://developercommunity.visualstudio.com/content/problem/1150322/nested-c20-template-lambdas-two-issues-with-captur.html
источник

SE

Stanislav Ershov in pro.cxx
источник

SE

Stanislav Ershov in pro.cxx
а вот и тулзы подъезжают
источник