gpt4 book ai didi

c++ - `push_back` 与 `emplace_back` 标志警告

转载 作者:行者123 更新时间:2023-11-30 01:41:48 25 4
gpt4 key购买 nike

我注意到在使用 Apple 的 clang - release (703.0.31) 时 - 推送 [signed] intstd::vector<unsigned int> 上通过 push_back方法会引发有关隐式符号转换的警告。鉴于警告标志,我对此感到满意,但惊讶于将其替换为 emplace_back方法没有产生警告。

我用 godbolt 测试了这个, 和 clang 3.9.0 表现出相同的行为。 gcc 6.2在任何一种情况下都不会产生警告。

由于隐式符号转换诊断不是(AFAIK)必需的行为,我会犹豫将其称为错误,但我很好奇我是否忽略了一些解释(或复杂化!)所表现行为的边缘情况。

最佳答案

好像这两者的区别:

signed a = 0;
unsigned b = a;

还有这个:

unsigned b = unsigned(a);

后者是阻止此类警告发生的典型方法(另一种方法是强制转换)。

当您调用 emplace_back() 时完全相同 - 此方法的全部要点是构造 value_type(在您的代码中未签名case) 来自给定的值。

同样,如果你有:

struct Foo { explicit Foo(int x) {} };

然后你可以这样做:

std::vector<Foo> v;
v.emplace_back(1);

但不是这个:

v.push_back(1);

综上所述,emplace_back()的意义不是“push_back()而是更高效”。相反,它是“在容器内使用这些参数构造一个 value_type”。

关于c++ - `push_back` 与 `emplace_back` 标志警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40819022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com