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

NKatUT

我以为我理解为什么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局部变量的理由吗?当默认值固定且在编译时已知时,编译器似乎应该能够为该函数构造适当的“默认参数”重载。

内森·奥利弗(NathanOliver)

这是有关寿命的问题。让我们修改功能为

auto get_functor() {
   constexpr auto local{1024};
   return [](auto arg1 = local){};    // "illegal use of local variable as default parameter"
}

现在,在的呼叫站点get_functor,您将获得一个lambda,其默认值是不再存在的对象的值。由于每次调用函数时都会评估默认参数,而没有为相应参数使用任何参数,因此您需要初始化表达式在所有范围内均有效。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么不允许将变量声明作为参数,而将函数声明作为参数?

为什么C ++不允许将参数作为默认参数?

为什么是 ;; 在局部变量声明之后允许,但在字段声明之后不允许?

为什么不允许auto作为函数参数?

为什么局部变量不允许使用volatile关键字?

为什么C ++不允许将函数参数用作默认值?

为什么在constexpr函数中不允许goto?

为什么Java允许在匿名内部类中重新分配类级别的变量,而局部变量不允许这样做

JLabel构造函数不允许将null作为参数

为什么不允许将非静态成员的地址作为模板非类型参数?

为什么Scala特性不允许构造函数参数?

为什么不允许我提供函数参数?

为什么角度不允许我将参数传递给提供程序的useFactory函数?

局部变量作为函数调用的参数

Windows类型不允许我的回调访问局部变量,有什么解决方法吗?

为什么String.Split()不允许将单个字符串作为参数

为什么在带有重复参数的Scala部分中不允许使用默认参数?

为什么Scala编译器不允许使用默认参数重载方法?

为什么此函数作为全局变量而不是局部变量运行?

为什么Checkstyle默认不允许使用受保护的变量?

为什么准备好的语句不允许字段和表名作为参数?

为什么str.endswith不允许“ suffix”参数作为列表?

为什么不允许double作为非类型模板参数?

为什么 class.getConstructor(parameters) 不允许子对象作为参数?

为什么 FormRecord 不允许使用对象作为第一个参数?

为什么C#默认不允许使用父级的构造函数?

为什么嵌套函数可以从外部函数访问变量,但不允许对其进行修改

为什么Clang不允许使用“和”作为函数名?

为什么 xquery 允许局部变量重新声明?