小编Eth*_*ris的帖子

初始化和lambda类型参数

我有这样一个实用类:

struct Atreturn
{
    std::function<void()> funcdestr;
    Atreturn( std::function<void()> fd ): funcdestr(fd) {}
    ~Atreturn() { funcdestr(); }
};
Run Code Online (Sandbox Code Playgroud)

注意explicit构造函数中没有属性.

可能的用途应该是:

  1. 直接初始化构造函数调用:

    Atreturn hook ( [something]() { DestroySomething(something); } );
    
    Run Code Online (Sandbox Code Playgroud)
  2. 复制初始化构造函数调用:

    Atreturn hook = [something]() { DestroySomething(something); };
    
    Run Code Online (Sandbox Code Playgroud)
  3. 直接列表初始化构造函数调用:

    Atreturn hook { [something]() { DestroySomething(something); }};
    
    Run Code Online (Sandbox Code Playgroud)

现在的问题是:据我所知,方法#1和#2应该被允许,因为它们在理论上是相同的,只要explicit在构造函数中没有,而不应该允许#3,因为这种语法会阻止转换(至少int如果你尝试的话就是如此int{2.1}).

但是,gcc 4.9允许方法#1和#3,但不允许#2(和说conversion from '...::<lambda()>' to non-scalar 'Atreturn' type requested).这听起来很疯狂,因为它通常只有你有explicit构造函数才会发生.谁能解释一下,为什么?

另外,让我更明确地说明这个问题:我需要一些不太笨拙的语法来初始化这个Atreturn对象,至少不需要额外的大括号或括号.问题是当参数是C++ 11 lambda时,具有自动缩进功能的编辑器在正确重新注册时会出现问题.所以我需要一些可以表达为的语法:

 Atreturn BLAH BLAH BLAH [something]() { DestroySomething(something); };
Run Code Online (Sandbox Code Playgroud)

c++ lambda constructor initialization c++11

6
推荐指数
1
解决办法
285
查看次数

标签 统计

c++ ×1

c++11 ×1

constructor ×1

initialization ×1

lambda ×1