2017-02-06 58 views
2

我希望有與默認值作爲參數的函數的對象的方法被調用,與lambda函數被調用,例如像:缺省功能對象值作爲函數參數與一個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)兩者是否有區別?

+0

它適用於VS2015。對作品的某些定義。它編譯。 – doctorlove

+1

具有默認功能意味着什麼? – NathanOliver

+0

1)它用'C++ 14'編譯([link](http://ideone.com/TiTiP9))。 2)如果你想要一個* empty * labda,你可以這樣寫:'f = [](){}' - 不只是'f = {}',但是你總是進入'if'。 –

回答

1

1)這是編譯器不支持的功能嗎?

您的測試似乎表明是這種情況。這是一個標準功能,所以不支持它意味着編譯器不符合標準。

2)兩者是否有區別?

沒有區別。 nullptr_t的默認構造函數和構造函數的行爲完全相同。

相關問題