class foo
{
std::shared_ptr<int> bar;
/*other stuff here*/
};
そのクラスで私はnew int
bar
を割り当てます。しかし、私はbar = new int();
と書くことができません。ポインタにはパブリック代入演算子がありません。
どのようにする必要があります私はこれを行いますか?私はstd::move
またはstd::swap
でしたが、どちらも正しいように見えませんでした。
class foo
{
std::shared_ptr<int> bar;
/*other stuff here*/
};
そのクラスで私はnew int
bar
を割り当てます。しかし、私はbar = new int();
と書くことができません。ポインタにはパブリック代入演算子がありません。
どのようにする必要があります私はこれを行いますか?私はstd::move
またはstd::swap
でしたが、どちらも正しいように見えませんでした。
あなたはこのためにreset
を使用することができます。これは、現在の内容をdelete
(もしあれば)とnew
式によって戻されることに内部ポインタを設定します
bar.reset(new int());
。
bar = std::make_shared<int>();
は、特に代入演算子の扱いやすさを保持したい場合は、一方向です。
編集しました。その変更はまだ 'int'を0に初期化しますか? 'new int()'は 'new int'には適用されません。 – Bathsheba
'std :: make_shared(new int())'は無効です。 'make_shared'は' T'コンストラクタに引数を完全に転送します。 ':: new(pv)T(std :: forward (args)...)'を使ってオブジェクトを構築するように指定されているので、argsがなければ値で初期化されます。 –
TartanLlama
@Bathsheba:そうです、 'make_ *'関数のいずれかの「初期化されていない」形式はありません。私はそのようなものが一度提案されたと思う(make_ {shared、unique}のためのサイズの配列型を許可する提案の一部として)、提案はデフォルト初期化を使用するmake _ * _初期化されていない形式で来ました。一般に、標準ライブラリは、時にはそれが必要なものであっても、初期化されていない値を生成することを非常に困難にします。 –