我想我明白为什么 C++ 不允许local变量作为默认函数参数:
int main () {
auto local{1024};
auto lambda = [](auto arg1 = local){}; // "illegal use of local variable as default parameter"
}
但即使该变量是一个也是不允许的局部常量表达式:
int main () {
constexpr auto local{1024};
auto lambda = [](auto arg1 = local){}; // "illegal use of local variable as default parameter"
}
然而,一个global允许变量(即使是非 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,其默认值是不再存在的对象的值。由于每次调用函数时都会评估默认参数,而相应参数没有参数,因此您需要初始化表达式在所有范围内都有效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)