我剛剛寫了一個簡單的方法來回傳一個由兩個 int 引陣列成的向量。但是,當我在普通括號內回傳初始化的 int 向量時,會導致編譯錯誤。
std::vector<int> getVec(int x, int y)
{
return({x, y}); // This causes compile error
return {x, y}; // This is fine
}
錯誤訊息說:
q.cpp: In function ‘std::vector<int> getVec(int, int)’:
q.cpp:8:21: error: expected ‘;’ before ‘}’ token
8 | return({x, y});
| ^
| ;
q.cpp:8:15: error: could not convert ‘((void)0, y)’ from ‘int’ to ‘std::vector<int>’
8 | return({x, y});
| ^~~~~~~~
| |
| int
uj5u.com熱心網友回復:
從回傳陳述句:
- 回傳運算式(可選);(1)
- 回傳大括號初始化串列;(2)
記住 the{..}不是運算式,沒有型別。存在一些允許{..}以某種型別推斷的背景關系。
return {..}(2)有一個特殊情況,它使用復制串列初始化來建構式的回傳值。
在 中return ({x, y}),我們進入(1),{x, y}仍然沒有型別, 沒有特殊情況({..})。所以錯誤。
uj5u.com熱心網友回復:
return {x, y};
{x, y}是 a std::initializer_list<int>,所以當你的編譯器看到這個時,它可以推斷出型別為:
std::vector<int>{std::initializer_list<int>{x, y}};
但:
return ({x, y});
這不是 systax 正確的:
std::vector<int>({std::initializer_list<int>{x, y}});
編譯器不知道 h? 來推斷這一點,所以它給出了一個編譯錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/346369.html
