2011-09-07 55 views
8

在C++ 0x中-n3290草案:他们在一节说:解构:12.4 /第二点最后一行析构函数应该不应该用指针声明吗?在C++

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

在C++ 03草案....他们没有提到这一点在破坏者?

我的问题是这样的类型声明是否

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

被允许? 他在草稿中没有描述过这个......宣言?

在GCC 4.6.0,太阳/ Oracle的C++ 12.0 --->这个声明是允许 INT科莫C/C++ - >不允许

回答

7

您误解了ref-qualifier意味着新标准。与C++ 03中的任何成员函数一样,您可以使用相同的方式提供const限定符,您还可以将一个参考限定符添加到C++ 0x中的成员函数中。该改性剂会影响隐this参数的类型的函数:

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

在同样的方式,析构函数不能static,或const,或const volatile在C++ 03,它不能采取REF C++ 0x中的限定符&&&)。当然,这一点在以前的标准中并不存在。

+0

@ DAvid:哦......但是根据析构函数的声明..他们只说邻接操作符..但没有他们所说的内容......允许这样的声明,不允许使用等... like *〜A(),&〜A()等 – user751747

+2

@ user751747:语法规定* ref-qualifier *被附加到最右侧的函数中(在* cv-qualifiers之后*),这意味着该句子引用:'〜A()&;'或'〜A()&&;',并将它们定义为无效。 '&~A();'和'*〜A();'是无效的,因为它们与*语法*不匹配,所以不需要对所有不应该编译的内容提供额外的描述。例如,在标准中没有任何地方说'a] [+ =/a'是不正确的,它只说明什么构造是正确的,哪一个与它们中的任何一个都不匹配。 –

+0

@ david:谢谢 – user751747

10

这看起来并不像它会永远成为任何形式的合法函数声明,更不用说析构函数了。我不太确定标准的这部分内容是什么,但我有一个猜测。

我怀疑有一个限定词说你的函数被右值引用调用。事情是这样的:

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

我觉得在标准的语言说,这个限定词不允许在析构函数,就像具有后const也将是非法的。

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

它清楚地表明函数现在可以在'cv-qualifer'之后有'ref-qualifier'。这意味着功能声明现在可以跟着const &const volatile &&而不是const。所用的术语(ref-qualifier)与您所引用标准的小部分所使用的术语相同。对于析构函数来说,它是不合适的。

+0

@ Omni:谢谢你的回答 – user751747

1

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

析构函数没有参数,也没有返回类型可以为它指定(甚至不为空)。

短语“没有返回类型可以为它指定”还禁止“*”,这是目前尚不清楚,但可以通过与12.3.2p1比较可以看出(与this issue report比较):

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

该规则是什么使得实现禁止* operator int() { }。你也可以说与12.4p1,虽然做为所表述非常笼统,在析构函数部分的第一条语句,我觉得上面的其他说法应该是主要参数

使用可选功能 - 特别声明语法说明符(7.1.2)后面跟着〜后跟析构函数的类名后跟一个空参数列表用于在类定义中声明析构函数。

可以看出/阅读,在该描述中没有提及诸如*这样的声明者,其显示了作者的意图。

+0

感谢您的回答 – user751747

相关问题