2017-02-06 9 views
2

Я хочу иметь метод с функцией объекта со значением по умолчанию в качестве параметра, который будет называться с лямбда-функции, как, например:значение по умолчанию объект функции в качестве параметра функции будет вызываться с лямбда

#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) Есть ли разница между обоими?

+0

Он работает на VS2015. Для некоторых определений работ. Он компилируется. – doctorlove

+1

Что значит иметь функцию по умолчанию? – NathanOliver

+0

1) Он компилируется с 'C++ 14' ([link] (http://ideone.com/TiTiP9)). 2) Если вы хотите * blank * labda, вы можете написать: 'f = []() {}' - не просто 'f = {}', но тогда вы всегда попадаете в 'if'. –

ответ

1

1) Это функция, не поддерживаемая компилятором?

Ваш тест показывает, что это так. Это стандартная функция, поэтому ее поддержка не означает, что компилятор не соответствует стандарту.

2) Есть ли разница между обоими?

Нет никакой разницы. И конструктор по умолчанию, и конструктор, который принимает nullptr_t, ведут себя точно так же.

 Смежные вопросы

  • Нет связанных вопросов^_^