2017-08-29 97 views
0

我嘗試使用升壓::可選我怎樣才能返回字符數組的boost ::可選

boost::optional<const char *> foo() { 
    char ar[100] = {}; 
    return boost::make_optional(true, ar); 
} 

返回簡單數組,我得到了以下錯誤:

could not convert ‘boost::make_optional(bool, const T&) [with T = char [100]](ar)’ from ‘boost::optional<char [100]>’ to ‘boost::optional<const char*>’ return boost::make_optional(true, ar); 

我該如何處理如此混亂?

+0

呃,你*不要!*如果你想有一個字符串,然後使用'std :: string'。如果你想要一個運行時可變的向量,然後使用'std :: vector'。如果你想要一個在編譯時固定大小的數組,然後使用'std :: array'。 –

+0

至於你的問題,數組不是指針,指針也不是數組。再次閱讀錯誤消息,並查看它推斷出「ar」的類型。然後將它與您所說的返回類型進行比較。 –

+0

但我知道數組的名稱是指向數組的第一個元素的指針。奇怪... –

回答

1

boost::make_optional推斷archar [100]型,但它預計const char *。默認情況下隱式轉換不會在模板參數推演中發生。

如果你想使用原始指針,可以採用如下方案:

boost::optional<const char *> foo() { 
    char ar[100] = {}; 
    return boost::make_optional(true, static_cast<const char *>(ar)); 
} 

但在這種情況下,你丟失信息的方式和位於該數組中的許多元素可能更好地在foo()功能使用std::vectorstd::arraysehe

祝你好運!

3

最接近你可以做的是通過使用包含值的語義。

也就是說包裝物上std::array

boost::optional<std::array<char, 100> > foo() { 
    std::array<char, 100> ar {}; 
    return boost::make_optional(true, ar); 
} 

關於數組指針對比: