我没有在SO中找到这个问题。如果是重复,请参阅答案并关闭此问题。
C ++ 11 lambda函数可以有一个可变参数列表吗?
auto displayMessage = [objectLog] (const char * sFormat, ...) {
...
}
答案 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 6
(LLVM 3.5svn
)并且编译得很好。
我猜这里与常规函数调用没有什么不同,唯一禁止的是使用auto
关键字。