Лямбда h() всегда обращается к переменной k, не являющейся constexpr.
Если я использую Like если constexpr(false){h(); , k никогда не будет перехвачен.
Но если я передам h() в другой функция g, такая как g(h), k, всегда будет захватываться, даже если во время компиляции известно, что условие constexpr ложно.
^ Это то, что я интерпретирую. Возможно, я совершенно не прав.
MCVE
https://wandbox.org/permlink/qmV1nsVWG6l62JlB
Тест 1 компилируется.
Тест 2 некомпилируется.
Код: Выделить всё
#include
#include
#include
int main(){
int k=3;
//vvv test 1:: (compilable)
// #define g(h) if constexpr(t!=5){h();}
//^^^ test 1
auto f= [&]() {
//vvv test 2:: (uncompilable)
auto g=[&](auto h) {if constexpr(t!=5) {h();} };
//^^^ test 2
g([&](){
if (k==5) { //: access 'k' non constant variable
}else {
int s=0;
}
});
return t+1;
};
constexpr int s=f.template operator()(); //not access 'k'
int s2=f.template operator()();// access 'k'
}
- Почему? Пожалуйста, объясните это и обратитесь к некоторым правилам C++. Мне нужно узнать больше.
- Как заставить мой код работать как тест 1, но без моего трюка с MACRO при сохранении g' простота использования?
Подробнее здесь: https://stackoverflow.com/questions/786 ... -to-always