带有变量参数列表的c++11 lambda函数
c++11 lambda function with variable parameter list
我在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 6
(LLVM 3.5svn
),它编译得很好。我想这里与常规函数调用没有什么不同,唯一被禁止的是使用auto
关键字。
相关文章:
- 这是在调用函数中重用 C++11 lambda 的明智模式吗?
- C++11 lambda 捕获"this"并按值捕获局部变量
- 何时在C 11 lambda的定义中捕获需要捕获的变量
- c++11 lambda 真的支持闭包吗?函数变量中存在语义冲突
- C++11 Lambda woes
- 异步、安全地使用 C++11 lambda
- 在C++11 lambda中通过引用捕获静态变量
- 有没有办法在声明中缩短C 11 lambda签名
- C 11 lambda可以分配给具有不正确签名的std ::功能
- 通过C 11 lambda中的参考捕获参考
- 我可以将 std::function (C++11 lambda) 与 Boost 一起使用吗?
- C++11 lambda 表达式末尾的括号
- C++11 lambda returning lambda
- C++11 Lambda闭包通过引用涉及一个堆栈变量,该变量离开作用域是允许的,但得到了未定义的行为
- c++11 lambda初始化的惩罚
- 通过模板化引用传递C++11 lambda
- C++11 lambda捕获实际捕获了多少
- C++11 lambda捕获列表[=]使用引用
- 带有变量参数列表的c++11 lambda函数
- 我们什么时候可以省略 C++11 lambda 中的返回类型