C++ 默认函数对象值作为要使用lambda调用的函数参数

C++ 默认函数对象值作为要使用lambda调用的函数参数,c++,c++11,visual-studio-2012,lambda,C++,C++11,Visual Studio 2012,Lambda,我希望有一个方法,该方法使用默认值作为参数的function对象,通过lambda函数调用,例如: #include <iostream> #include <functional> void func(const std::function<void()>& f = {}){ if(f) f(); else std::cout << "or not" << std::endl; } int main() { f

我希望有一个方法,该方法使用默认值作为参数的function对象,通过lambda函数调用,例如:

#include <iostream>
#include <functional>

void func(const std::function<void()>& f = {}){
  if(f) f();
  else std::cout << "or not" << std::endl;
}

int main() {
  func([](){ std::cout << "hello" << std::endl; });
  func();
}
#包括
#包括
void func(const std::function&f={}){
if(f)f();
其他标准::cout
1) 这是编译器不支持的功能吗

您的测试似乎表明了这一点。这是一个标准功能,因此不支持它意味着编译器不符合标准

2) 两者之间有什么区别吗


没有区别。默认构造函数和接受
nullptr_t
的构造函数的行为完全相同。

它在VS2015上工作。对于某些定义,它可以编译。拥有默认函数意味着什么?1)它使用
c++14
()编译。2)如果你想要一个空的labda,你可以编写:
f=[]({}
-不仅仅是
f={}
,但如果
@NathanOliver函数包装器的默认状态为空,则始终会进入
,这意味着它可能无法调用。您有一个以函数对象作为参数的方法,而不是lambda。您可以使用lambdas调用它,因为std::function中存在一个隐式构造函数,它接受一个参数。
void func(const std::function<void()>& f = nullptr){