我有这样一个实用类:
struct Atreturn
{
std::function<void()> funcdestr;
Atreturn( std::function<void()> fd ): funcdestr(fd) {}
~Atreturn() { funcdestr(); }
};
Run Code Online (Sandbox Code Playgroud)
注意explicit构造函数中没有属性.
可能的用途应该是:
直接初始化构造函数调用:
Atreturn hook ( [something]() { DestroySomething(something); } );
Run Code Online (Sandbox Code Playgroud)复制初始化构造函数调用:
Atreturn hook = [something]() { DestroySomething(something); };
Run Code Online (Sandbox Code Playgroud)直接列表初始化构造函数调用:
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)