指定std :: function的默认值

jea*_*ean 46 c++ lambda

void func(const std::function<void()>& f = empty)
{
    if(f)
        f();
}
Run Code Online (Sandbox Code Playgroud)

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

101*_*010 53

void func(const std::function<void()>& f = {}) {
    if(f) f();
}
Run Code Online (Sandbox Code Playgroud)

现场演示

  • @suzuiyue http://en.cppreference.com/w/cpp/utility/functional/function/operator_bool (2认同)

nh_*_*nh_ 20

const std::function<void()>& f = nullptr
Run Code Online (Sandbox Code Playgroud)

要么

const std::function<void()>& f = std::function<void()>()
Run Code Online (Sandbox Code Playgroud)

  • 是的,默认的`std :: function`正在抛出一些异常(我忘了哪一个).... (2认同)
  • @BasileStarynkevitch:寻找该对象:`1 /当函数包装对象没有目标时,function :: operator()(20.8.11.2.4)抛出bad_function_call类型的异常。 (2认同)

Ser*_*sta 10

我会使用nullptr为空案例.它可以使用,因为你从不使用完整的函数对象,但只指向它们,所以func(f1);实际上 func(&f1)=>你总是将指针传递给func,所以nullptr恕我直言是最好的候选者.

这编译并运行:

void func(const std::function<void()>& f = nullptr)
{
    if(f)
        f();
}
Run Code Online (Sandbox Code Playgroud)

使用默认函数的替代方法是:

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

使用异常捕获.2之间的选择主要取决于你是否期望空案发生; 几乎从不:有时与异常相比:在通话前测试.

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