質問

ワーキングドラフトはそれを明示的に呼びかけています デフォルトの関数 特別なメンバー関数(コピーコンストラクタ、デフォルト構成装置など(§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は、関数を「削除」と宣言するため、とにかく宣言しないでください)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top