相关疑难解决方法(0)

一个积极的lambda:'+ [] {}' - 这是什么巫术?

在Stack Overflow问题中,在C++ 11中不允许重新定义lambda,为什么?,给出了一个不编译的小程序:

int main() {
    auto test = []{};
    test = []{};
}
Run Code Online (Sandbox Code Playgroud)

问题得到了回答,一切似乎都很好.然后是Johannes Schaub并做了一个有趣的观察:

如果你+在第一个lambda之前放置一个,它会神奇地开始工作.

所以我很好奇:为什么以下工作呢?

int main() {
    auto test = +[]{}; // Note the unary operator + before the lambda
    test = []{};
}
Run Code Online (Sandbox Code Playgroud)

它与GCC 4.7+和Clang 3.2+都很好.代码标准是否符合要求?

c++ lambda operator-overloading language-lawyer c++11

255
推荐指数
1
解决办法
3万
查看次数

了解Lambda闭包类型如何删除默认构造函数

从5.1.2开始

[19]与lambda表达式关联的闭包类型具有已删除(8.4.3)的默认构造函数和已删除的副本分配运算符。它具有一个隐式声明的副本构造函数(12.8),并且可能具有一个隐式声明的move构造函数(12.8)。[注意:复制/移动构造函数的隐式定义与其他任何隐式声明的复制/移动构造函数的隐式定义相同。—尾注]

我正在阅读C ++ Primer 14.8.1,它解释了Lambda表达式被编译器翻译成未命名类的未命名对象。如果删除默认构造函数,如何定义不包含lambda捕获的lambda函数对象?

 auto g = [](){};
Run Code Online (Sandbox Code Playgroud)

这在概念上与...不同吗?

 class lambdaClass{
 public:
      lambdaClass() = delete;
      lambdaClass& operator=(const lambdaClass&) = delete;
      void operator()(){ }

      //copy/move constructor and destructor implicitly defined
};

auto g = lambdaClass(); //would be an error since default is deleted.
Run Code Online (Sandbox Code Playgroud)

如果有捕获,则将定义除默认构造函数以外的其他构造函数,并且可以初始化此类对象(只要传递了参数)就可以了。但是,如果没有捕获并且删除了默认构造函数,则在概念上似乎无法创建lambda类对象。

编辑:嗯,尽管这是C ++ Primer中描述的方式,但是lambda类根据其lambda捕获创建构造函数的概念是没有根据的(因为我在标准中找不到该引用),因为以下代码甚至无法正常工作尽管我希望它在概念上:

int sz = 2;
auto a = [sz](){ return sz;};
decltype(a) b(10); //compiler error
decltype(a) b = a; //all good though
Run Code Online (Sandbox Code Playgroud)

c++ lambda constructor default

4
推荐指数
1
解决办法
3793
查看次数