【问题标题】:Is it okay to use template types from the enclosing function within lambdas in C++11?可以在 C++11 的 lambda 中使用封闭函数中的模板类型吗?
【发布时间】:2013-02-01 03:46:58
【问题描述】:

所以我目前有一些类似这样的代码:

(注意:不是实际代码,为简洁起见,只是从一个有点冗长和复杂的方法中删减了。)

template<typename ArgT0, typename ArgT1, typename FuncT>
static void addMethod( const std::string& name, FuncT func )
{
   Method script_func = [&]( const Arguments& args ) -> Value
   {
      func(UnsafeAnyCast<ArgT0>(args[0]),UnsafeAnyCast<ArgT1>(args[1]));
      return Value::Undefined();
   }

   _prototype->Set( name, script_func );
}

它在 Visual Studio 2010 中运行良好,但我知道这远不能保证它是符合标准的 C++。就在 lambda 中使用模板参数而言,这有什么问题吗?

【问题讨论】:

  • 它不应该与问题真正相关,但 Arguments 是一个容器类,用于通过嵌入式脚本语言中的函数调用传递的参数。我的问题是在 lambda 中使用 ArgT0 和 ArgT1 模板类型是否符合标准。
  • 我理解这个问题。由于在函数中的任何地方都看不到参数,所以我询问了它。

标签: c++ templates c++11 lambda


【解决方案1】:

是的,这是符合标准的:lambda 表达式可以访问其封闭范围内的所有可见名称,它只是您需要捕获的变量

5.1.2 Lambda 表达式 [expr.prim.lambda]

9 最小封闭范围是块范围的 lambda 表达式 (3.3.3) 是一个局部 lambda 表达式;任何其他 lambda 表达式 其 lambda-introducer 中不应有捕获列表。到达 本地 lambda 表达式的范围是封闭范围的集合 到并包括最里面的封闭函数及其参数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    相关资源
    最近更新 更多