指定std :: function的默认值

void func(const std::function<void()>& f = empty) { if(f) f(); } 

什么是'空'应该是? 我使用[](){} 。 但从技术上讲,这不是空的,f()将执行。

 void func(const std::function<void()>& f = {}) { if(f) f(); } 

现场演示

 const std::function<void()>& f = nullptr 

要么

 const std::function<void()>& f = std::function<void()>() 

我会使用nullptr为空的情况。 它可以被使用,因为你从来不使用全function的对象,但只有指针,所以func(f1); 将事实上func(&f1) =>你总是会传递指向func的指针,所以nullptr是恕我直言最好的候选人。

这个编译和运行:

 void func(const std::function<void()>& f = nullptr) { if(f) f(); } 

使用默认function的替代方法是:

 void func(const std::function<void()>& f = std::function<void()>()) { try { f(); } catch(std::bad_function_call e) { } } 

使用exception捕获。 2之间的select主要取决于你是否期望空的情况发生; 几乎从来没有:有时与例外与去:在通话之前testing。

由于问题提到if (f) ,使用nullptr

你可以这样尝试:

 const std::function<void()> & f = std::function<void()>() 

正如巴西尔补充说的,标准说:

§20.8.11.1类bad_function_call [func.wrap.badcall]

1 /当函数包装器对象没有目标时,由function :: operator()(20.8.11.2.4)抛出bad_function_calltypes的exception。