带有变量参数列表的c++11 lambda函数

c++11 lambda function with variable parameter list

本文关键字:c++11 lambda 函数 列表 变量 参数      更新时间:2023-10-16

我在SO中没有找到这个问题。如果它是重复的,请参考答案并关闭这个问题。

C++11 lambda函数是否可以有一个变量参数列表?

auto displayMessage = [objectLog] (const char * sFormat, ...) {
     ...
}

是的,语法允许,没有什么禁止。

lambda声明符在5.1.2[expr.prim.lambda]中定义为:

lambda声明符
 nbsp nbsp;(参数声明子句

在8.3.5[dcl.fct]中,参数声明子句定义为:

参数声明子句
 nbsp nbsp参数声明列表optopt
 nbsp nbsp参数声明列表。。。

此外,G++、Clang和EDG都毫无问题地接受了它。

在引擎盖下,C++11 lambda生成具有operator()成员函数的闭包类型,并且该函数没有理由不具有...,例如这个lambda表达式:

auto l = [](int, ...) { }

生成如下类型:

struct unnamed_closure_type {
  void operator()(int, ...) const { }
};

这是完全有效的C++。

这比我想象的要容易,正如之前所说的那样。

我必须承认我以前可以尝试过,但我是C++初学者,因此我认为它更复杂。这是一个带有可变参数列表的lambda函数的代码。此lambda函数用于内部日志记录-直接记录到stdout或文件。

auto displayMessage = [objectLog] (const char * sFormatString, ...)
{
    char sMessage [MAX_LOG_LINE_LENGTH];
    va_list vArgPtr;
    va_start(vArgPtr, sFormatString);
    vsnprintf(sMessage, sizeof(sMessage), sFormatString, vArgPtr);
    // EDIT: according to Jonathan Wakely's comment - added va_end()...
    va_end(vArgPtr);
    if ( objectLog )
    {
        objectLog->insertLogEntry("%s", sMessage);
    }
    else
    {
        printf("%s", sMessage);
    }
};

我刚刚尝试了Apple LLVM 6LLVM 3.5svn),它编译得很好。我想这里与常规函数调用没有什么不同,唯一被禁止的是使用auto关键字。