Поделиться через


Предупреждение C26402

Return a scoped object instead of a heap-allocated if it has a move constructor (r.3).

Замечания

Чтобы избежать путаницы о том, принадлежит ли указатель объекту, функция, возвращающая перемещаемый объект, должна выделить его в стеке. Затем он должен возвращать объект по значению, а не возвращать выделенный кучей объект. Если требуется семантика указателя, верните умный указатель вместо необработанного указателя. Дополнительные сведения см. в руководстве по C++ Core R.3. Предупреждайте, возвращает ли функция объект, выделенный в функции, но имеет конструктор перемещения. Рекомендуется вместо этого рассмотреть вопрос о возврате по значению.

Пример

В этом примере показана bad_example функция, которая вызывает предупреждение C26409. В нем также показано, как функция good_example не вызывает эту проблему.

// C26402.cpp

struct S
{
    S() = default;
    S(S&& s) = default;
};

S* bad_example()
{
    S* s = new S(); // C26409, avoid explicitly calling new.
    // ...
    return s; // C26402
}

// Prefer returning objects with move contructors by value instead of unnecessarily heap-allocating the object.
S good_example() noexcept
{
    S s;
    // ...
    return s;
}