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

时间:2015-03-18 13:34:46

标签: c++ c++11 lambda

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

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

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

3 个答案:

答案 0 :(得分:3)

是的,语法允许它,没有任何条件禁止它。

lambda-declarator 在5.1.2 [expr.prim.lambda]中定义为:

  

λ-说明符
  ( parameter-declaration-clause mutable opt exception-specification opt attribute-specifier-seq opt trailing-return-type opt

parameter-declaration-clause 在8.3.5 [dcl.fct]中定义为:

  

参数声明子句
   parameter-declaration-list opt ... opt
   parameter-declaration-list ,...

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

在幕后,C ++ 11 lambda生成一个带有operator()成员函数的闭包类型,并且没有理由该函数不能有...,例如这个lambda表达式:

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

生成如下类型:

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

这是完全有效的C ++。

答案 1 :(得分:2)

这比我想象的要容易,并且在没有任何禁止它之前意味着它。

我必须承认我以前可以尝试过,但我是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);
    }
};

答案 2 :(得分:0)

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