5

ワーキングドラフトは、defaulted-functionsは特別なメンバー関数でなければならないことを明示的に示しています(例えば、copy-constructor、default-constructorなど(§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;
4

3 に答える 3

4

全部大丈夫だと思います。

= 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++の次の反復で、明示的に削除されたクラスが追加されても、私は驚かないでしょう。

于 2010-05-20T15:44:38.183 に答える
4

C ++ 0x仕様(§[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
于 2010-05-20T15:57:00.697 に答える
-3

「削除された」メンバー関数の定義から私が理解していることは、コンパイラーによって自動的に作成できる特別なメンバー関数(コンストラクター、コピー、代入)にのみ適用され、通常のメンバー関数には適用されないということです(すべてのIMO、関数を「削除」することを宣言するため、とにかくそれらを宣言しないでください)

于 2010-05-20T15:43:25.860 に答える