警告 C26402
Return a scoped object instead of a heap-allocated if it has a move constructor (r.3).
解説
ポインターがオブジェクトを所有するかどうかについて混乱しないように、移動可能なオブジェクトを返す関数は、それをスタックに割り当てる必要があります。 その後、ヒープで割り当てられたオブジェクトを返す代わりに、値でオブジェクトを返す必要があります。 ポインター セマンティクスが必要な場合は、生ポインターではなくスマート ポインターを返します。 詳細については、「C++ Core Guidelines 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;
}