是否有一个特定的原因为什么落后的返回型不是班级的完整级别上下文



请注意,[class.mem] p6

中未提及A trafing-return-type

类的完整级上下文是

(6.1)功能主体,
(6.2)默认参数,
(6.3)noexcept特征器([[excep.spec]),
(6.4)合同条件或
(6.5)默认成员启动器

在类的成员规范中。[注意:完整的班级嵌套类的上下文也是任何任何人的完整上下文封闭类,如果嵌套的类是在封闭类的成员规范。 - 终注]

[expr.prim.this] p2也有一个注释:

如果声明声明会员函数或成员函数类X类的模板,表达式这是类型的prvalue可选的CV-Qualifier-Seq之间的"指向CV-Qualifier-Seq X的指针"以及功能定义的结束,会员 - 列器或声明人。它不会在可选的CV-Qualifier-seq之前出现它不得出现在静态成员的声明中函数(尽管其类型和值类别是在静态成员功能,因为它们在非静态成员中功能)。[注意:这是因为声明不匹配直到已知完整的声明人。 - 终点注] [注:在落后返回型,定义的课程不需要完成班级会员访问的目的。班级成员声明以后看不到。 [示例:...

因为您不想要它。

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

现在,您需要各种规则来解释上述哪个,哪些是不允许的。

那么,为什么标准位置 noexcept-pexifier 完整级上下文?这样的代码中是否允许基本相同的事情:

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指定符视为完整的上下文。

最新更新