我使用的是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;
}
没有发出警告。
这个警告意味着什么?可以安全地忽略它(尽管需要无警告代码)吗?
英特尔有一个完全解决这个问题的网站,正是你的问题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
}
下列:
解析度:
- 提供用于初始化引用的适当对象。
- 对于矢量的后推功能,可以安全地忽略此警告。向量将参数复制到自己的存储中;它从不存储原始论点。因此,使用临时是非常安全的。
所以你可能会忽略这个警告,即使这与一般规则相矛盾也绝不会忽视警告。
在我看来,英特尔选择了一种糟糕的方式,因为误诊导致的警告阻碍了发展。