【问题标题】:Can any function be a deleted-function?任何函数都可以是删除函数吗?
【发布时间】:2011-02-21 22:50:06
【问题描述】:

工作草案明确指出defaulted-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;

【问题讨论】:

  • 什么是删除函数?
  • 被删除的函数是指如果它没有被删除就已经存在的函数。例如。您可以删除类复制ctor。出于两个原因,这比使其私有未实现要好一些。 1.阅读代码时更明显 2.可以得到更清晰的错误信息。
  • @MSalters:您还可以删除不存在的函数,阻止它们的使用。例如。给定void f(double); void f(int) = delete;,f(42) 现在是一个错误,而不是使用隐式转换。

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


【解决方案1】:

我认为他们都很好。

= 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++ 迭代添加显式删除的类,我不会感到惊讶。

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 它可以用于任何有默认值的函数。例如,禁用促销。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      相关资源
      最近更新 更多