在下标运算符中使用 lambda 似乎不适用于 g++ 和 clang。
这是实现错误还是 c++ 标准中的“不愉快”规则?
例子:
class A
{
public:
template<typename T> void operator[](T) {}
template<typename T> void operator()(T) {}
};
int main()
{
A a;
a[ [](){} ]; // did not compiler: see error message
a( [](){} ); // works as expected
}
错误:
main.cpp:13:6: error: two consecutive '[' shall only introduce an attribute before '[' token
a[ [](){} ];
^
main.cpp:13:15: error: expected primary-expression before ']' token
a[ [](){} ];
我知道属性以“[[”开头,但我想知道“[[”(带有一个或多个空格)也可以像这样工作:
void func( int x [ [gnu::unused] ] ) {} // compiles fine! :-(
最佳答案
您必须将 lambda 括在括号中。否则编译器认为两个 [[
引入了一个属性。
使用 operator delete 可能会出现类似的问题。例如你必须写
delete ( [] { return ( new int() ); }() );
或
delete [] ( [] { return ( new int[10] ); }() );
那就是你必须将 lambda 括在括号中。
关于c++ - 下标迭代器中的 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39411971/