析构函数是否应该用指针声明OR?在C ++中

时间:2011-09-07 06:16:57

标签: c++ destructor declaration c++11

在C ++ 0x -n3290草案中:他们在章节中添加:Destructors:12.4 / 2nd point last line

          **A destructor shall not be declared with a ref-qualifier.**

在c ++ 03 Draft ....他们没有在析构函数中提到这一点?

我的问题是否是

   *~S() ;   //this declaration is allowed or not according to the Standard's
   //**~S(); ***~S() ; etc...........

允许这种声明吗? 他没有在草案中描述过这个......宣言?

在GCC 4.6.0中,Sun / Oracle C ++ 12.0,--->允许此声明 int Comeau C / C ++ - >不允许

3 个答案:

答案 0 :(得分:10)

这似乎不是任何类型的合法函数声明,更不用说析构函数了。我不是肯定标准的那部分是在谈论什么,但我有一个猜测。

我怀疑有一个限定符说你的函数是在右值引用上调用的。像这样:

class A {
 public:
   void IAmAnRValue() &&;
};

我认为标准中的语言是说析构函数不允许使用此限定符,就像尾随const也是非法的一样。

而且,在进一步调查中,我对我的猜测正确性的确定性大大提高。这是理由:

在那里明确指出,在'cv-qualifer'之后,函数现在可能具有'ref-qualifier'。这意味着函数声明现在可以跟const &const volatile &&而不仅仅是const。使用的术语(ref-qualifier)与您引用的标准中使用的术语相同。而析构函数无法拥有它是有道理的。

答案 1 :(得分:7)

您误解了 ref-qualifier 在新标准中的含义。与在C ++ 03中为任何成员函数提供const限定符的方式相同,您还可以将 ref-qualifier 添加到C ++ 0x中的成员函数。该修饰符将影响函数的隐式this参数的类型:

struct test {
   void f() const &&;  // implicit "this" in "f" is of type "test const &&"
};

与析构函数在C ++ 03中不能staticconstconst volatile的方式相同,它不能使用 ref-qualifier &&&)在C ++ 0x中。当然,这个位在前一个标准中并不存在。

答案 2 :(得分:1)

您正在寻找的规则在同一段落中说明,12.4p2

  

析构函数不带参数,也不能为它指定返回类型(甚至不是void)。

短语“不能为它指定返回类型”也禁止“*”,这不是立即清楚但可以通过与12.3.2p1(与this issue report比较)看出来:

  

......这些功能称为转换功能。不能指定返回类型。

该规则是实施禁止* operator int() { }的原因。您也可以与12.4p1争论,虽然因为它的表达非常通用并且是析构函数部分中的第一个语句,我认为上面的其他声明应该是主要参数

  

使用可选函数说明符(7.1.2)后跟〜后跟析构函数的类名后跟空参数列表的特殊声明符语法用于在类定义中声明析构函数。

从可以看到/读到的那个描述中没有提到诸如*之类的声明者,这表明了作者的意图。