簡體   English   中英

如何在不強制轉換每個參數的情況下在初始值設定項列表中刪除從 int 到 char 的縮小轉換?

[英]How to remove narrowing conversion from int to char inside initializer list without casting every argument?

這是我嘗試做的:(與std::vector<int>

char s = 4;
std::vector<int> i;
std::vector<char> c;

i.insert(i.end(),{s+1,s+2,s+3}); // no warnings
c.insert(c.end(),{s+1,s+2,s+3}); // narrowing conversions of {s+1,s+2,s+3} from ints to chars

我知道我可以施展,但這很快就會變得丑陋。 (尤其是有更多的論點)

c.insert(c.end(),{(char)(s+1),(char)(s+2),(char)(s+3),(char)(s+4),(char)(s+5),(char)(s+6)});

我們必須忍受這個嗎? 或者,還有更好的方法?

initializer_list縮小轉換是一個問題。 請參閱警告的答案:縮小轉換 C++11

您可以使用輔助函數來解決該問題。

namespace MyApp
{
   char next(char c, int n) { return c+n; }
}

並將其用作

c.insert(c.end(), {MyApp::next(s, 1), MyApp::next(s, 2), MyApp::next(s, 3)});

如果您的列表是常規列表,則可以使用循環代替

for (int i = 1; i <= 3; ++1)
{
    c.insert(c.end(), s + i);
}

如果它不正常,您可以構建一個std::initializer_list ,然后使用insert的范圍重載插入到向量中,如

{
    auto elems  = {s+1,s+2,s+3};
    c.insert(c.end(), elems.begin(), elems.end());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM