2015-06-21 68 views
1

你能以某種方式通過boost::optional左值作爲一個函數的參考,它改變了值嗎?像這樣的東西(http://coliru.stacked-crooked.com/a/f77d3b095af3d66b):傳遞boost ::可選的左值作爲函數的參考

#include <iostream> 

#include <boost/optional.hpp> 

void foo(int& x) 
{ 
    x = 3; 
} 

int main() { 
    boost::optional<int> y; 
    foo(*y); 
    std::cout << *y << std::endl; 
} 

這是不行的,勿庸置疑。

該函數需要使用標準類型作爲輸出參數tho(例如int& x)。我希望我正確地解釋這一點。我在詢問我的意圖的一般可能性。

回答

2

是的。您只需初始化optional就像編譯錯誤提示:

boost :: optional :: reference_type boost :: optional :: get()[with T = int; boost :: optional :: reference_type = int &]:聲明`this-> is_initialized()'失敗。

這工作&打印3

#include <iostream> 
#include <boost/optional.hpp> 

void foo(int& x) 
{ 
    x = 3; 
} 

int main() { 
    boost::optional<int> y = 2; 
    foo(*y); 
    std::cout << *y << std::endl; 
} 

由運指出一個重要的一句話是,即使初始值是不是在編譯時未知,升壓無論如何都會斷言可選的狀態(在operator*get()),這意味着如果未設置可選項(boost::none),則應用程序將崩潰。

因此,您可以使用包含有效值的可選項(非boost::none)進行初始化,也可以傳遞optional<int>&

+0

不錯,雖然它不可能通過boost :: none :(。實際上,我通過調用一個可以返回int值或boost :: none的方法初始化'y'。如果它返回'boost :: none',它將會聲明,你已經回答了這個問題,謝謝! – clime

+0

True:\你可以初始化它(使用非'boost :: none')或者傳遞'boost ::可選&'到你的功能。 –