您好,登錄后才能下訂單哦!
本篇內容主要講解“C++中為什么不要使用可變參數”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C++中為什么不要使用可變參數”吧!
F.55 不要使用可變參數
Reason(原因)
從va_arg中讀出內容的處理假設實際傳遞的數據類型是正確的。傳遞可變參數的處理假設數據會按照正確的類型被讀取。由于通常這兩種假設都不能在語言中強制達成安全,只能依靠編程規范以保證其正確。因此說都是脆弱的。
Example(示例)
int sum(...) {
// ...
while (/*...*/)
result += va_arg(list, int); // BAD, assumes it will be passed ints
// ...
}
sum(3, 2); // ok
sum(3.14159, 2.71828); // BAD, undefined
template<class ...Args>
auto sum(Args... args) { // GOOD, and much more flexible
return (... + args); // note: C++17 "fold expression"
}
sum(3, 2); // ok: 5
sum(3.14159, 2.71828); // ok: ~5.85987
譯者注:代碼中使用了兩種現代C++的新特性,一個是C++11中引入的可變參數模板(variadic template),另一個是C++17引入的折疊表達式(fold expression)。
Alternatives(備選方案)
overloading
重載
variadic templates
可變參數列表
variant
arguments
variant(C++17引入的變體數據,譯者注)類型參數。
initializer_list
(homogeneous)
初始化列表(同類數據的情況)(C++11引入)
Note(注意)
定義一個...參數在無法決定實際參數類型時一種有用的技術,尤其是定義可以接受任何東西的函數以便在重載版本中禁止“任何其他的東西”或者在模板元程序中表示包羅萬象的容器。
Enforcement(實施建議)
Issue a diagnostic for using va_list
, va_start
, or va_arg
.
發起對使用va_list,va_start或者va_arg的檢查。
Issue a diagnostic for passing an argument to a vararg parameter of a function that does not offer an overload for a more specific type in the position of the vararg. To fix: Use a different function, or [[suppress(types)]]
.
發起針對以下情況的檢查:向函數的可變參數可變參數傳遞單獨的實參,而且不存在在可變參數位置定義了特定數據類型參數的重載函數。
修改建議:使用不同的函數或者[[抑制((類型準則群組))]]
到此,相信大家對“C++中為什么不要使用可變參數”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。