【问题标题】:default function object value as function parameter to be called with a lambda默认函数对象值作为要使用 lambda 调用的函数参数
【发布时间】:2017-06-23 11:30:25
【问题描述】:

我想要一个函数对象的方法,该函数对象以默认值作为参数,用 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();
}

但在 Visual Studio 2012 上,这不会编译(例如,它使用 Visual Studio 2015 或 g++ 编译),抱怨默认值 {}。将其更改为:

void func(const std::function<void()>& f = nullptr){

解决问题。 1)这是编译器不支持的功能吗? 2) 两者有什么区别吗?

【问题讨论】:

  • 它适用于 VS2015。对于作品的一些定义。它编译。
  • 有默认函数是什么意思?
  • 1) 它使用c++14 (link) 编译。 2) 如果你想要一个 empty labda,你可以写:f = [](){} - 不仅仅是f = {},但你总是会进入if
  • @NathanOliver 函数包装器的默认状态是空的,这意味着它可能不会被调用。
  • 您有一个以函数对象为参数的方法,而不是lambda。您可以使用 lambdas 调用它,因为在 std::function 中存在一个隐式构造函数,它接受一个。

标签: c++ c++11 visual-studio-2012 lambda


【解决方案1】:

1) 这是编译器不支持的功能吗?

您的测试似乎表明情况确实如此。它是一个标准特性,所以不支持它意味着编译器不符合标准。

2) 两者有什么区别吗?

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

【讨论】:

    猜你喜欢
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多