その特定のケースを防ぐために、ポインターを使用することを選択できます(Weep(&std::vector<int>{1,2,3})許可されていないため)、または一時的にエラーになるconst以外の参照を使用することもできます。
Woop(const std::vector<int> *nums);
Woop(std::vector<int> *nums);
Woop(std::vector<int>& nums);
これらは依然として値が有効であることを保証しませんが、少なくとも最も簡単な間違いをなくし、コピーを作成せずnums、特別な方法で作成する必要がありません(例:as std::shared_ptrまたはstd::weak_ptrdoesなど)。
std::scoped_lockmutexへの参照を取得することは一例であり、unique / shared / weak ptrが本当に望まれない場合の例です。多くの場合、これstd::mutexは基本的なメンバーまたはローカル変数です。それでも十分に注意する必要がありますが、これらの場合、一般的に寿命を決定するのは簡単です。
std::weak_ptr非所有の別のオプションですが、呼び出し側に使用を強制しshared_ptr(したがってヒープ割り当ても)、それが望ましくない場合もあります。
コピーに問題がなければ、問題は回避されます。
Woop所有権を取得する必要がある場合は、r値として渡して移動(およびポインター/参照の問題を完全に回避)するunique_ptrか、値自体を移動できないか、ポインターを有効なままにしておく場合に使用します。
// the caller can't continue to use nums, they could however get `numbers` from Woop or such like
// or just let Woop only manipulate numbers directly.
Woop(std::vector<int> &&nums)
: numbers(std::move(nums)) {}
std::vector<int> numbers;
// while the caller looses the unique_ptr, they might still use a raw pointer, but be careful.
// Or again access numbers only via Woop as with the move construct above.
Woop(std::unique_ptr<std::vector<int>> &&nums)
: numbers(std::move(nums)) {}
std::unique_ptr<std::vector<int>> numbers;
または、所有権が共有されている場合はshared_ptr、すべてに使用でき、最終的な参照とともに削除されますが、これを使用すると、オブジェクトのライフサイクルの追跡が非常に混乱してしまいます。
std::unique_ptr所有権のstd::shared_ptr共有、所有権の共有、またはstd::weak_ptr少なくとも、失われたデータの認識)。