![](/img/trans.png)
[英]What are the use-cases of "complete-class context"? What's the benefit that a "complete-class context" provides?
[英]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.