我以为我理解为什么C ++不允许将局部变量作为默认函数参数:
int main () {
auto local{1024};
auto lambda = [](auto arg1 = local){}; // "illegal use of local variable as default parameter"
}
但是即使该变量是constexpr local,也不允许这样做:
int main () {
constexpr auto local{1024};
auto lambda = [](auto arg1 = local){}; // "illegal use of local variable as default parameter"
}
但是,允许使用全局变量(即使非constexpr):
int global;
int main () {
auto lambda = [](int arg1 = global){}; // OK
}
有人可以解释在这种情况下不允许使用constexpr局部变量的理由吗?当默认值固定且在编译时已知时,编译器似乎应该能够为该函数构造适当的“默认参数”重载。
这是有关寿命的问题。让我们修改功能为
auto get_functor() {
constexpr auto local{1024};
return [](auto arg1 = local){}; // "illegal use of local variable as default parameter"
}
现在,在的呼叫站点get_functor
,您将获得一个lambda,其默认值是不再存在的对象的值。由于每次调用函数时都会评估默认参数,而没有为相应参数使用任何参数,因此您需要初始化表达式在所有范围内均有效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句