任何函数都可以是删除函数吗?

时间:2010-05-20 15:37:03

标签: c++ c++11 deleted-functions

工作草案明确指出默认函数必须是特殊的成员函数(例如copy-constructor,default-constructor等,(§8.4.2.1-1))。这很有道理。

但是,我没有看到 deleted-functions (第8.4.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;

3 个答案:

答案 0 :(得分: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 ++迭代添加了明确删除的类,我不会感到惊讶。

答案 1 :(得分: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

答案 2 :(得分:-3)

根据我对“已删除”成员函数的定义的理解,它仅适用于可由编译器自动创建的特殊成员函数(构造函数,复制,赋值),而不适用于普通成员函数(这使得没有任何意义的IMO,声明函数被“删除”,所以只是不要声明它们无论如何)