在警告级别为3的int的std :: vector push_back中编译器警告

sch*_*312 7 c++ vector compiler-warnings

我使用的是intel c ++编译器icc版本18.0.3.

如果我编译下面的代码与-w3

#include <vector>

int main() {
    std::vector<int> vec;
    vec.push_back(2);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

test_w3.cpp(6):备注#383:复制到临时值,引用临时使用的vec.push_back(2);

更换的2与一个常量变量作为

#include <vector>
int main() {
    std::vector<int> vec;
    const int a = 2;
    vec.push_back(a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

没有发出警告.

这个警告意味着什么?可以安全地忽略它(尽管需要无警告代码)吗?

use*_*999 11

英特尔正是这种问题正好与你的问题的网站在这里.它是从2008年开始,但似乎适用于您的问题.警告存在,因为此编程样式可能会导致隐藏的临时对象,并且在某些情况下可以忽略.

他们说明了这个例子:

void foo(const int &var)
{
}

void foobar()
{
    std::vector<std::string> numlist
        // 383 remark here: a tempory object with "123" is created
        numlist.push_back("123");       
    foo(10);       // gives 383

}
Run Code Online (Sandbox Code Playgroud)

下列:

解析度:

  • 提供用于初始化引用的适当对象.
  • 对于矢量的后推功能,可以安全地忽略此警告.向量将参数复制到自己的存储中; 它从不存储原始论点.因此,使用临时是非常安全的.

所以你可以忽略这个警告,即使这与一般规则相矛盾也不要忽视警告.

在我看来,英特尔选择了一种糟糕的方式,因为误诊导致的警告阻碍了发展.

  • 遗憾的是,忽略警告是一个非常糟糕的主意,因为这意味着*真实*警告会淹没在误报中.这就是为什么这样的警告(可能是假阳性)开始时是一个坏主意.这是一个糟糕的警告.它应该在命令行选项中全局禁用. (9认同)
  • 我完全同意 (4认同)