题
工作草案明确召集 默认功能 必须是特殊的成员函数(例如复制构造人,默认构造人等(§8.4.2.1-1))。这是完全合理的。
但是,我看不到任何这样的限制 删除功能(§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;
解决方案
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,要声明“删除”函数,所以无论如何都不要声明它们)
不隶属于 StackOverflow