Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指定std::函数的默认值 void func(const std::function&f=empty) { 如果(f) f(); }_C++_Lambda - Fatal编程技术网

C++ 指定std::函数的默认值 void func(const std::function&f=empty) { 如果(f) f(); }

C++ 指定std::函数的默认值 void func(const std::function&f=empty) { 如果(f) f(); },c++,lambda,C++,Lambda,“空”应该是什么?我使用[](){}。但从技术上讲,这不是空的,f()将执行。const std::function&f=nullptr void func(const std::function<void()>& f = empty) { if(f) f(); } 或 常量std::function&f=std::function() 您可以这样尝试: const std::function<void()>& f = std:

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

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

常量std::function&f=std::function() 您可以这样尝试:

const std::function<void()>& f = std::function<void()>()
常量std::function&f=std::function() 正如Basile所补充的,该标准规定:

§20.8.11.1类错误的函数调用[函数封装错误调用]

1/引发类型为bad_函数_调用的异常 当函数包装器对象 没有目标

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

对于空的案例,我会使用null ptr。可以使用它,因为您从不使用完整函数对象,而只使用指向它们的指针,所以
func(f1)将是
func(&f1)
=>您将始终向func传递指针,因此
nullptr
是最佳候选

这将编译并运行:

void func(const std::function<void()>& f = {}) {
    if(f) f();
}
void func(const std::function&f=nullptr)
{
如果(f)
f();
}
使用默认函数的替代方法是:

void func(const std::function<void()>& f = nullptr)
{
    if(f)
        f();
}
void func(const std::function&f=std::function()){
试一试{
f();
}
catch(std::错误的函数调用e){
}
}
使用异常捕获。这两种情况之间的选择主要取决于您是否期望出现空情况;几乎从不:带异常去与有时:呼叫前测试


正如问题所提到的,如果(f)
,请使用
nullptr

是,默认的
std::function
会引发一些异常(我忘了是哪一个)…@BasileStarynkevitch,但OP的代码会在调用之前检查该函数是否为空。或者这不是你的意思吗?@BasileStarynkevitch:-寻找这个:
1/当函数包装器对象没有目标时,function::operator()(20.8.11.2.4)抛出类型为bad\u function\u调用的异常。
?@suzuiyue你是什么意思?我没有看到bool cast或!操作员过载。那么,如果(f)或(f)f工作的话,为什么?SuuuiYo我现在刚进入STD:函数,但是我想是因为C++是用C++风格的函数指针创建的,在这里你检查FP是否为空,F是对lambda创建的未命名函数的函数指针。“如果我错了,有人可以在这里纠正我。@suzuiyue”
void func(const std::function<void()>& f = {}) {
    if(f) f();
}
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) {
    }
}