指定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。