次の方法で共有


警告 C26402

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

解説

ポインターがオブジェクトを所有するかどうかについて混乱しないように、移動可能なオブジェクトを返す関数は、それをスタックに割り当てる必要があります。 その後、ヒープで割り当てられたオブジェクトを返す代わりに、値でオブジェクトを返す必要があります。 ポインター セマンティクスが必要な場合は、生ポインターではなくスマート ポインターを返します。 詳細については、「C++ Core Guidelines R.3: 関数がその関数内で割り当てられたオブジェクトを返すときに、そのオブジェクトに移動コンストラクターがある場合に警告します。代わりに値で返すことを検討するよう提案します。」を参照してください。

この例では、警告 C26409 を発生させる bad_example 関数を示します。 また、この問題が発生しない関数 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;
}