使该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

08-16 08:59