【问题标题】:A destructor Shall OR shall not be declared with a pointer ? in C++析构函数 不应使用指针声明 OR 吗?在 C++ 中
【发布时间】:2011-11-11 21:04:15
【问题描述】:

在 C++0x -n3290 Draft 中:他们在部分添加: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++ -->不允许

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      您误解了 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 中。当然这个位在以前的标准中是没有的。

      【讨论】:

      • @ DAvid :哦 ...但是就析构函数的声明而言..他们只说邻接〜运算符..但他们没有说...这样的声明是允许的,不允许的等等...比如 *~A(),&~A() 等等
      • @user751747:语法规定 ref-qualifier 附加到最右边的函数(在 cv-qualifiers 之后),并且这意味着该句子指的是:~A() &;~A() &&;,并将它们都定义为无效。 &~A();*~A(); 无效,因为它们与 语法 不匹配,因此无需对不应编译的所有内容提供额外的描述。例如,在标准中没有任何地方说 a][+=/a 不正确,它只说明了哪些结构是正确的,并且其中任何一个都不匹配。
      • @David 我认为这是不正确的*~A() 以及&~A() 匹配语法。应该有一些规则使它们无效。我还没有检查过那个规则...
      • @litb: 语法在哪里是允许的?我从 member-specification 开始(假设声明析构函数的上下文是成员声明符),我还没有找到任何语法允许 member-规范* 开头。你怎么能做到这一点?
      • @David *ptr-operator 并且是 declarator (member-declarator) 的一部分。想想没有intint *a;
      【解决方案3】:

      您要查找的规则在同一段落 12.4p2 中说明

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

      短语“no return type can be specified for it”也禁止使用“*”,这点不是很清楚,但可以通过与12.3.2p1对比(对比this issue report):

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

      该规则使实现禁止* operator int() { }。您也可以与 12.4p1 争论,尽管这措辞非常笼统,并且是析构函数部分的第一条语句,我认为上面的另一条语句应该是主要论点

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

      正如所见/阅读的那样,该描述中没有提到诸如* 之类的声明符,这表明了作者的意图。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-18
        • 1970-01-01
        • 1970-01-01
        • 2021-06-27
        • 1970-01-01
        • 2011-06-20
        • 2019-10-28
        • 2021-05-16
        相关资源
        最近更新 更多