trailing-return-type不是类的完整类上下文的具体原因是什么?

Bel*_*loc 10 c++ language-lawyer

请注意,[class.mem] p6中未提及trailing-return-type

一个完整的类的上下文是一个

(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之前,它不应出现在静态成员函数的声明中(尽管它的类型和值类别是在静态成员函数中定义的,因为它们在非静态成员函数中) .[注意:这是因为声明匹配在完整声明符已知之前不会发生.- 尾注] [注意:在trailing-return-type中,为了类成员访问的目的,要求定义的类不需要完整.稍后声明的类成员不可见.[例子:......

n. *_* m. 7

因为你不想要它.

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

     auto baz() -> decltype(qux());
     auto qux() -> decltype(baz());
 }; 
Run Code Online (Sandbox Code Playgroud)

现在你需要各种规则来解释上面哪些是允许的,哪些不是.

那么为什么标准将noexcept-specifier放在完整的类上下文中呢?它不会在这样的代码中允许基本相同的东西:

struct Test { 
    void foo() noexcept(noexcept(bar())); 
    void bar() noexcept(noexcept(foo())); 
};
Run Code Online (Sandbox Code Playgroud)

?

似乎标准没有很好地解决这个问题,编制者对此的处理也不同.Clang抱怨上面的代码,但吃了这个:

struct Test { 
    void foo() noexcept(Test::b);
    static const bool b = true;
};
Run Code Online (Sandbox Code Playgroud)

GCC也抱怨第二个代码,但接受代码与成员声明交换.似乎它根本不将noexcept说明符视为完整类上下文.

  • 不,我绝对不知道它将如何工作。缺少构建名称依赖关系图,验证它是否非循环并自上而下进行的工作,甚至无法考虑如何解释。您的示例不需要任何此类操作,所有函数体都将在类中的所有其他内容之后进行处理。 (2认同)
  • 核心问题[361](http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#361)中指出了“ noexcept”的自指问题。 (2认同)