5

工作草案明确指出默认函数必须是特殊的成员函数(例如复制构造函数、默认构造函数等(第 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;
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 回答