2015-02-08 100 views
1

我可以typedef一個std::bind表達式的返回類型,但顯然編譯器並不滿意我調用此類型的默認構造函數。相反,我必須首先通過與std::bind完全相同的論點(參見下文)。爲什麼?我做錯了嗎?std :: bind返回的類型是默認構造的嗎?

#include <iostream> 
#include <functional> 

#define x_plus_one(T) std::bind<T>(f_plus<T>(), std::placeholders::_1, T(1)) 

template <class T> 
struct f_plus 
{ 
    inline T operator() (const T& a, const T& b) const 
     { return a + b; } 
}; 

template <class T> 
using x_plus_one_type = decltype(x_plus_one(T)); 

int main() 
{ 
    auto f = x_plus_one(double); 
    std::cout<< f(3.2) << "\n"; 

    // auto g = x_plus_one_type<double>(); ==> fails, no matching constructor 
    auto g = x_plus_one_type<double>(f_plus<double>(), std::placeholders::_1, 1); // but this works?! 
    std::cout<< g(3.2) << "\n"; 
} 

我也試過路過一個f_minus函數對象,並交換佔位符和1,但是編譯器不喜歡它,這真讓我困惑。唯一有效的工作是取代1,其中2,它告訴我,無論bind返回的類型是什麼,它都不復制輸入。爲什麼不?有沒有辦法強制複製?

回答

4

std::bind返回的類型未指定。因此,如果可以通過調用std::bind以外的任何其他方式來構建它,則沒有具體說明。您可以使用std::unique_ptrboost::optional來獲得未構建的值。

+0

嗯,這並不理想,但我想這是正確的答案,謝謝。 – Sheljohn 2015-02-08 13:45:19