繁体   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