簡體   English   中英

尾隨返回類型不是類的完整類上下文是否有特定原因?

[英]Is there a specific reason why a trailing-return-type is not a complete-class context of a class?

請注意, [class.mem] p6中未提及尾隨返回類型

一個類的完整類上下文是

(6.1)功能主體,
(6.2)默認參數,
(6.3)noexcept-specifier([except.spec]),
(6.4)合同條件,或
(6.5)默認成員初始化

在類的成員規范內。 [注意:如果嵌套類是在封閉類的成員規范中定義的,則嵌套類的完整類上下文也是任何封閉類的完整類上下文。 —尾注]

[expr.prim.this] p2也對此有一個注釋:

如果聲明聲明了類X的成員函數或成員函數模板,則該表達式是在可選cv-qualifier-seq和函數定義結尾之間的“指向cv-qualifier-seq X的指針”類型的prvalue。 ,成員聲明符或聲明符。 它不應出現在可選的cv-qualifier-seq之前,也不應出現在靜態成員函數的聲明中(盡管其類型和值類別是在靜態成員函數中定義的,因為它們在非靜態成員函數中) 。 [注意:這是因為聲明匹配直到知道完整的聲明器才發生。 —結束注釋] [注意: 在尾隨返回類型中,出於訪問類成員的目的,所定義的類不需要是完整的。 稍后聲明的類成員不可見。 [示例:...

因為你不想要它。

 struct Test {
     auto foo() -> decltype(bar());
     auto bar() -> int;

     auto baz() -> decltype(qux());
     auto qux() -> decltype(baz());
 }; 

現在,您需要各種規則來解釋上面的哪些是允許的,哪些是不允許的。

那么,為什么標准將noexcept-specifier放置在完整類上下文中 它不會在代碼中允許以下基本相同的內容:

struct Test { 
    void foo() noexcept(noexcept(bar())); 
    void bar() noexcept(noexcept(foo())); 
};

似乎該標准不能很好地解決此問題,並且編譯器對此的處理方式有所不同。 Clang抱怨上面的代碼,但是吃了這個:

struct Test { 
    void foo() noexcept(Test::b);
    static const bool b = true;
};

GCC也抱怨第二個代碼,但是接受交換了成員聲明的代碼。 看來noexcept指定符根本就不當作完整類上下文。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM