在下标运算符中使用 lambda 似乎不适用于 g++ 和 clang。
这是 C++ 标准中的实现错误还是“不愉快”的规则?
Example:
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
}
Error:
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 括在括号中。否则编译器会考虑两个[[
作为引入一个属性。
使用运算符删除也会出现类似的问题。例如你必须写
delete ( [] { return ( new int() ); }() );
or
delete [] ( [] { return ( new int[10] ); }() );
也就是说,您必须将 lambda 括在括号中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)