削除された機能を削除できますか?
-
03-10-2019 - |
質問
ワーキングドラフトはそれを明示的に呼びかけています デフォルトの関数 特別なメンバー関数(コピーコンストラクタ、デフォルト構成装置など(§8.4.2.1-1))である必要があります。それは完全に理にかなっています。
ただし、そのような制限はありません 削除された関数(§8.4.3)。そうですか?
または、言い換えれば、これらの3つの例が有効です c++0
?
struct Foo
{
// 1
int bar( int ) = delete;
};
// 2
int baz( int ) = delete;
template< typename T >
int boo( T t );
// 3
template<>
int boo<int>(int t) = delete;
解決
C ++ 0x Spec(§[dcl.fct.def.delete])はそのような構造を否定せず、G ++ 4.5はそれらの3つすべてを認識します。
x.cpp: In function 'int main()':
x.cpp:4:8: error: deleted function 'int Foo::bar(int)'
x.cpp:21:11: error: used here
x.cpp:9:5: error: deleted function 'int baz(int)'
x.cpp:22:2: error: used here
x.cpp:9:5: error: deleted function 'int baz(int)'
x.cpp:22:8: error: used here
x.cpp:17:5: error: deleted function 'int boo(T) [with T = int]'
x.cpp:23:7: error: used here
他のヒント
彼らはすべて大丈夫だと思います。
= delete
過負荷が使用されないようにするのに適しています(§8.4.3/2)。
5か月後、私は他の答えを見ます… delete
暗黙の定義を備えた関数に役立つだけではありません。これは、「実装なし - これを使用することはリンカーエラーです」というコメントのクリーンな代替手段です。何かを実装しない明確な方法を提供します。たとえば、明示的な専門分野のみが実際に存在するベーステンプレートです。コンパイラは、リンク時間前に文句を言います。
少し奇妙ですが、完全に合理的な例については、考慮してください
class abc {
protected:
inline virtual ~abc() = 0;
inline virtual void do_something() = 0;
};
abc::~abc() {}
void abc::do_something = delete;
両方 = 0
と = delete
同じ関数で使用できます。それなし = delete
, 、ユーザーは偶然の礼儀電話をかけることができます abc::do_something()
.
C ++ 0xが明示的に削除されたクラスを追加した後のC ++の次の反復が驚かないでしょう。
「削除された」メンバー関数の定義から私が理解していることから、それは、コンパイラが自動的に作成し、通常のメンバー関数ではなく(それは意味をなさない特別なメンバー関数(コンストラクター、コピー、割り当て)にのみ適用されることです(すべてのIMOは、関数を「削除」と宣言するため、とにかく宣言しないでください)