【发布时间】:2016-02-22 16:19:50
【问题描述】:
void func(const std::function<void()>& f = empty)
{
if(f)
f();
}
“空”应该是什么?我使用 [](){} 。但从技术上讲,那不是空的,f() 会执行。
【问题讨论】:
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()>()
【讨论】:
std::function 会抛出一些异常(我忘了是哪一个)......
1/ An exception of type bad_function_call is thrown by function::operator() (20.8.11.2.4) when the function wrapper object has no target. ?
我会为空的情况使用 nullptr。之所以可以使用它,是因为您从不使用完整的函数对象,而只使用指向它们的指针,所以 func(f1); 实际上将是 func(&f1) => 您将始终将指针传递给 func,因此 nullptr 是恕我直言的最佳候选者。
编译并运行:
void func(const std::function<void()>& f = nullptr)
{
if(f)
f();
}
使用默认函数的替代方法是:
void func(const std::function<void()>& f = std::function<void()>()) {
try {
f();
}
catch(std::bad_function_call e) {
}
}
使用异常捕获。 2之间的选择主要看你是否期望出现空壳;几乎从不:例外与有时:调用前测试。
问题提到if (f),使用nullptr
【讨论】:
你可以这样试试:
const std::function<void()> & f = std::function<void()>()
Basile 补充说,标准说:
§ 20.8.11.1 类 bad_function_call [func.wrap.badcall]
1/ bad_function_call 类型的异常被抛出 function::operator() (20.8.11.2.4) 当函数包装对象 没有目标。
【讨论】: