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

问题描述 投票:7回答:1

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

如果我用following code编译-w3

#include <vector>

int main() {
    std::vector<int> vec;
    vec.push_back(2);
    return 0;
}

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

Replacing 2用const变量作为

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

没有发出警告。

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

c++ vector compiler-warnings
1个回答
11
投票

英特尔有一个完全解决这个问题的网站,正是你的问题here。它是从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

}

下列:

解析度:

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.