c++ - 下标迭代器中的 lambda

标签 c++ c++11 lambda attributes language-lawyer

在下标运算符中使用 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/

相关文章:

c++ - 将 C++ lambda 传递给 C 函数

C++ cout 十六进制格式

C++ 类型删除,用 std::function 捕获单个类的多个方法

c++ - 如何将变量传递给 std::async?

c++ - 移动 std::mutex 的构造函数

java 8 lambda 和 JSF managedBean

c# - 在基本构造函数中使用 lambda 表达式的极端情况

python - C++ 和 Python 之间/中的区别

java - 尝试在 QT 项目中调用 Java 代码时找不到类异常

c++ - 隐藏在中央小部件下的小部件