限定 id 的 decltype 表示在嵌套名称说明符中具有 `const T` 与 `T` 的类成员

Lan*_*yer 7 c++ constants decltype language-lawyer

下面代码中的静态断言会触发吗?

#include <type_traits>
using namespace std;

struct S { int i; };
using CS = const S;

static_assert(is_same_v<decltype((CS::i)), decltype((S::i))>);
Run Code Online (Sandbox Code Playgroud)

Clang 和 MSVC 没问题,GCC 认为断言触发,因为表示的类型decltype((CS::i))const int&,表示的类型decltype((S::i))int&https : //godbolt.org/z/5MqPX_。(UPD:正如评论中所披露的那样,static_assert(is_same_v<decltype(CS::i), decltype(S::i)>);所有三个编译器都接受了https://godbolt.org/z/V5y-tD,但我对保证这一点的措辞感兴趣)。

[basic.type.qualifier]/1 似乎只保证Tconst T具有相同的对象表示和对齐方式,但不保证const T的成员与 的相应成员具有相同的 cv 限定T

该死,如果采用 100% 迂腐模式:我什至不认为标准要求查找const T应找到名为 的成员N,如果T有这样的成员。const T可以c_N代替N并具有与T(假设c_Nconst decltype(T::N)类型)相同的对象表示和对齐要求。我没有发现 [basic.type.qualifier]/1 中的“版本”一词具有任何规范意义/义务。

INB4 你指向我 C++11/C++14/C++17 的 [class.name]/5 说

如果在需要类名的地方使用命名 cv 限定类类型的typedef-name,则忽略 cv 限定符。

嵌套名称说明符不需要类名(语法允许类名typedef-name)。[class.derived] 的base-clause (? base-specifier-list ? base-specifier ? class-or-decltype ) 可以(语法不允许typedef-name)。无论如何,上面引用的句子已被P1131R2在 C++20 中删除,并且关于 cv-qualifiers ignore 的措辞去了 [class.derived],它适用的唯一地方(在类定义中的基类列表中) .