为什么constexpr局部变量不允许作为默认函数参数?



我想我理解为什么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,其默认值是一个不再存在的对象的值。由于每次调用函数时都会计算默认实参,而对应的形参没有实参,因此需要初始化表达式在所有作用域中都有效。

最新更新