我正在使用 assert.h 中的断言宏
我已经定义了 lambda 来执行断言检查。

int val1 = 0;
int val2 = 1;

const auto check = [val1,val2]()-> bool
{
    return val1 < val2;
};
// no error for this call
assert(check() && "Test is failed");

// no error for this call
assert([=]()-> bool
       {
           return val1 < val2;
       }() && "Test is failed");



为什么我得到



当我使用断言宏并在捕获列表中使用多个参数定义 lambda 时,会出现编译错误吗?

最佳答案

问题是捕获列表中的逗号。

预处理器对 C++ 语法的理解极其有限,它主要进行琐碎的文本替换。如果逗号不在匹配的内括号之间(当然也不是像字符串文字那样的标记的一部分),预处理器会将其视为宏调用参数的分隔符。

因此,预处理器认为您正在使用两个参数 [this 和第一个逗号后面的其余内容调用断言,从而产生错误。

您可以使用一组额外的括号来修复此错误:

int i = -7, j = 7;
assert(([i,j](){return i + j;}()));

对于标准爱好者:



N4140 中的 16.3/11,重点是我的。

关于c++ - 在 Xcode [c++] 中在 assert (assert.h) 内定义 lambda 时,为类似函数的宏调用编译错误提供了太多参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35957357/

10-14 09:59