工作草案明确指出默认函数必须是特殊的成员函数(例如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;
答案 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,声明函数被“删除”,所以只是不要声明它们无论如何)