問題タブ [defaulted-functions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C ++ 11のデフォルト関数のポイントは何ですか?
C ++ 11には、特別なメンバー関数のデフォルト実装を作成するようにコンパイラーに指示する機能が追加されています。関数を削除することの価値はわかりますが、関数を明示的にデフォルト設定することの価値はどこにありますか?空白のままにしておくと、コンパイラがとにかくそれを行います。
私が見ることができる唯一のポイントは、デフォルトのコンストラクターは、他のコンストラクターが存在しない場合にのみ作成されるということです。
しかし、それはあなたが今それをする方法より本当に良いですか?
または、ユースケースがありませんか?
c++ - コピー/移動コンストラクタまたはデストラクタを「デフォルト」にするのはなぜですか?
C ++ 0xでは、特定の関数をデフォルトとして指定できます。
これらの関数の実装は、コンパイラーがそれらを生成した場合と同じです。これは、ほとんどの状況で、独自の関数を宣言しない場合に通常発生します。
いずれかのctor(上記の他のいずれか)を宣言した場合、デフォルトのctorは生成されないため、デフォルトで「元に戻す」必要がある場合があります。
ただし、ベースまたはデータメンバーがそれらを除外しない限り、クラスには常にコピーアンドムーブctor—があり、それらが除外されている場合、デフォルトの実装は機能しません。クラスには常にdtorがあります。
コピーctor、移動ctor、またはデストラクタを明示的にデフォルト設定する必要があるのはなぜですか?とにかく、暗黙的に生成された実装は同じことをしませんか?
c++ - パラメータの型がわからない場合、どうすれば特別なメンバー関数をデフォルトにすることができますか?
このケースを考えてみましょう:
ムーブ コンストラクターを明示的に宣言したので、削除されていないコピー コンストラクターが必要な場合は、コピー コンストラクターを明示的に宣言する必要があります。必要に応じdefault
て、正しいパラメーターの型を見つけるにはどうすればよいですか?
そのようなシナリオが実際のプログラムで実際に発生したケースに遭遇したかどうかにも興味があります。スペックは言う
明示的にデフォルト設定された関数は...
- 同じ宣言された関数型を持っている (参照修飾子が異なる可能性があること、およびコピー コンストラクターまたはコピー代入演算子の場合を除き、パラメーターの型が "非 const T への参照" である可能性があることを除きます。ここで、T は関数の名前です)。メンバー関数のクラス) が暗黙的に宣言されたかのように、
暗黙的に宣言されたコピー コンストラクターが typeA &
を持つ場合、コピー コンストラクターをパラメーター type で明示的にデフォルト設定する必要がありますA &
。しかし、暗黙的に宣言されたコピー コンストラクターがパラメーター typeを持つ場合、明示的にデフォルト設定されたコピー コンストラクターにパラメーター type を持たせたくA const&
ありませんA &
。
A &
暗黙的に宣言された関数がパラメーターの型を持ち、明示的にデフォルト設定された宣言がパラメーターの型を持っている場合、上記の規則に違反するため、両方のバージョンを宣言することはできませんA const&
。私が見ることができることから、暗黙の宣言がA const&
であり、明示的な宣言が である場合にのみ違いが許されますA &
。
編集:実際、仕様はさえ言っています
関数が最初の宣言で明示的にデフォルト設定されている場合、...
- コピー コンストラクター、ムーブ コンストラクター、コピー代入演算子、またはムーブ代入演算子の場合は、暗黙的に宣言されている場合と同じパラメーター型を持ちます。
したがって、これらのクラス外を定義する必要があります(私が見ることができる限り、唯一の違いは、関数が非自明になることであり、これらの場合にとにかくそうである可能性があるため、害はないと思います)
明示的に宣言された関数がA const&
であり、暗黙の宣言が である場合、無効であることがわかりましたA &
。
ユーザー提供の明示的にデフォルト設定された関数 (つまり、最初の宣言後に明示的にデフォルト設定された関数) は、明示的にデフォルト設定された時点で定義されます。そのような関数が削除済みとして暗黙的に定義されている場合、プログラムは不適切な形式です。
これは、GCC が行っていることと一致します。さて、暗黙的に宣言されたコンストラクターの型を一致させるという当初の目標をどのように達成できますか?
c++ - クラス本体でプライベートコンストラクターをデフォルトにすることはできますか?
GCC 4.5ではこれができません:
それは次のように不平を言っています:
エラー: 非パブリック アクセスで宣言された 'foo::foo(const foo&)' は、クラス本体でデフォルト設定できません
エラー: 非パブリック アクセスで宣言された 'foo& foo::operator=(const foo&)' は、クラス本体でデフォルト設定できませんクラス本体
しかし、GCC 4.6 ではそれが可能です。どちらが正しいですか?
c++ - 明示的なデフォルト デストラクタで std::unique_ptr pimpl を使用する
以下のクラスを定義する場合
次のエラー (icpc) が表示されます。
/home/toolworks/gcc/4.8.2/bin/../include/c++/4.8.2/bits/unique_ptr.h(65): エラー: 不完全な型は許可されていません static_assert(sizeof(_Tp)>0, ^次の期間に検出されました:
184 行目の「void std::default_delete<_Tp>::operator()(_Tp *) const [with _Tp=FooImpl]」のインスタンス化 「std::unique_ptr<_Tp, _Dp>::~unique_ptr() [ with _Tp=FooImpl, _Dp=std::default_delete]" /home/toolworks/gcc/4.8.2/bin/../include/c++/4.8.2/bits/shared_ptr_base.h" インスタンス化の 290 行目"/home/toolworks/gcc/4.8.2/bin/. ./include/c++/4.8.2/bits/shared_ptr_base.h" "std::_Sp_counted_ptr<_Ptr, _Lp>::~_Sp_counted_ptr() [with _Ptr=Foo *, _Lp=__gnu_cxx::_S_atomic]" の暗黙的な生成「/home/toolworks/gcc/4.8.2/bin/../include/c++/4.8.2/bits/shared_ptr_base.h」の286行目「/home/toolworks/gcc/4.8.2/bin/../include」の 286 行目のクラス「std::_Sp_counted_ptr<_Ptr, _Lp> [with _Ptr=Foo *, _Lp=__gnu_cxx::_S_atomic]」のインスタンス化/c++/4.8.2/bits/shared_ptr_base.h" の 452 行目の "std::_Sp_counted_ptr<_Ptr, _Lp>::_Sp_counted_ptr(_Ptr) [with _Ptr=Foo *, _Lp=__gnu_cxx::_S_atomic]" のインスタンス化"/home/toolworks/gcc/4.8.2/bin/../include/c++/4.8.2/bits/shared_ptr_base.h" "std::__shared_count<_Lp>::__shared_count(_Ptr) のインスタンス化 [ with _Lp =__gnu_cxx::_S_atomic, _Ptr=Foo *]" "/home/toolworks/gcc/4.8.2/bin/../include/c++/4.8.2/bits/shared_ptr_base.h" の 740 行目で " std::__shared_ptr<_Tp, _Lp>::__shared_ptr(_Tp1 *) [with _Tp=Foo, _Lp=__gnu_cxx::_S_atomic,「std::shared_ptr<_Tp> ::shared_ptr(_Tp1 *) [with _Tp=Foo, _Tp1=Foo]" "main.cc" の ... 行
ただし、デフォルト以外のデストラクタを定義すると、次のようにコンパイルされます。
フー。
Foo.cc
コンパイルします。「= default」をコンパイルする必要があると述べた場所をいくつか見ましたが、それは暗黙のデフォルト関数と同じクラスではありません(私はc ++ 11が初めてです)。
では、最初の Foo がコンパイルされないのはなぜでしょうか?
注:デフォルトのデストラクタではなく、デフォルトのデストラクタについて尋ねたので、それがどのように複製されるかわかりません
c++ - =default はアクセス指定子を無視しますか?
private
デフォルトのコンストラクターが(4.8.1 g++)であるにもかかわらず、次のプログラムが正常にコンパイルされるのは非常に奇妙です。
実際には標準の 8.4.2[2] から (N3242)
明示的にデフォルト設定された関数は、暗黙的に constexpr として宣言されている場合にのみ、constexpr として宣言できます。最初の宣言で明示的にデフォルト設定されている場合、
— それは公開されなければならない。
..........
アクセス仕様を無視するデフォルト指定子の正確な目的は何ですか? これにより、ユーザーにデフォルト値を作成させたくないが、実装にデフォルトのコンストラクターが必要な、クラス デザイナーが保証しないインターフェイスの問題が発生する可能性があるように感じます。おそらく、デフォルトのコンストラクターが通常public
であり、それを複製することを目的としているためだと思いましたが、コピーコンストラクターが仕様を無視しないdefault
理由には答えません。=default
private
copy/move
実際、明示的にデフォルト設定されたコンストラクター/割り当てが作成されていないことが言及されている標準からはわかりませんpublic
。