Предупреждение компилятора в std :: vector push_back для int с уровнем предупреждения 3 - PullRequest
0 голосов
/ 11 сентября 2018

Я использую компилятор intel c ++ icc версии 18.0.3.

Если я скомпилирую следующий код с -w3

#include <vector>

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

test_w3.cpp (6): примечание # 383: значение скопировано во временное,ссылка на временно используемый vec.push_back (2);

Замена 2 на переменную const на

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

не выдает предупреждение.

Что означает это предупреждение?Можно ли его безопасно проигнорировать (хотя код без предупреждения желателен)?

1 Ответ

0 голосов
/ 11 сентября 2018

У Intel есть сайт, посвященный именно этой проблеме, и именно эта проблема здесь .Это с 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

}

следующее:

Разрешение:

  • Обеспечить надлежащий объект для инициализации ссылки.
  • Может безопасно игнорировать это предупреждение для функции обратного хода вектора.Вектор копирует аргумент в свое собственное хранилище;он никогда не хранит исходный аргумент.Поэтому использование временного кода совершенно безопасно.

Таким образом, вы можете игнорировать предупреждение, даже если это противоречит общему правилу , никогда не игнорировать предупреждения .

По моему мнению, Intel выбрала неверный путь, так как предупреждения, возникающие из-за неправильной диагностики, мешают развитию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...