將此ScopeExit類關閉代碼項目,但它不會構建在GCC 4.5.3上。感謝任何幫助。通過ctor rvalue參數進行Lambda賦值
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++ 11代碼:爲什麼使用'private'構造函數/運算符來禁止這些?有什麼錯誤'ScopeExit(func_t&)= delete;'?另請注意,編譯器生成的默認構造函數是禁用的,因爲該類型具有用戶定義的構造函數,並且如果構造函數onyl接受rvalues,則從左值構造是不可能的,因此這兩個構造函數都不需要被徹底刪除。對於'operator new/delete'使用'= delete;'應該這樣做。 – Grizzly
我沒有寫代碼。就像我說的,它來自代碼項目。 –