使该ScopeExit类脱离了代码项目,但它无法基于GCC 4.5.3构建。感谢任何帮助。
class ScopeExit : private boost::noncopyable
{
typedef std::function<void()> func_t;
public:
ScopeExit(func_t&& f) : func(f) {}
~ScopeExit() { func(); }
private:
// no default ctor
ScopeExit();
// Prohibit construction from lvalues.
ScopeExit(func_t&);
// Prohibit new/delete.
void* operator new(size_t);
void* operator new[](size_t);
void operator delete(void *);
void operator delete[](void *);
const func_t func;
};
ScopeExit exit = [&]() { };
gcc 4.5.3错误:
In member function ‘void test()’:
error: conversion from ‘test()::<lambda()>’ to non-scalar type ‘ScopeExit’ requested
编辑:
ScopeExit exit([&]() { }); // this works
最佳答案
它是复制/移动初始化。您的复制c-tor被删除,移动c-tor也被删除。
n3337 12.8 / 9
不知道为什么第一种情况不起作用,但是这种情况很好
template<typename T>
ScopeExit(T&& f) : func(std::move(f)) {}
ScopeExit(ScopeExit&& rhs) : func(std::move(rhs.func)) { }]
编辑。
当我们使用类类型变量的
copy-initialization
时,仅使用标准和省略号隐式转换。从lambda到函数指针或从函数指针到std::function
的转换是user-defined conversion
,不使用。n3337 8.5 / 16
n3337 13.3.1.4/1
n3337 13.3.2
n3337 13.3.3.1/4