工作草案明确召集 默认功能 必须是特殊的成员函数(例如复制构造人,默认构造人等(§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,要声明“删除”函数,所以无论如何都不要声明它们)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top