下面代码中的静态断言要不要火?
#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))>);
Clang和MSVC都没问题,GCC认为这个断言会着火,因为类型用 decltype((CS::i))
是 const int&
的类型,并以 decltype((S::i))
是 int&
: https:/godbolt.orgz5MqPX_。. (更新。 如评论中所披露: static_assert(is_same_v<decltype(CS::i), decltype(S::i)>);
被三个编译器所接受 https:/godbolt.orgzV5y-tD。但我对保证这一点的措辞很感兴趣)。)
basic.type.qualifier]1似乎只保证了 T
和 const T
有相同的对象表示和对齐方式,但不是那种 const T
的成员与相应的成员具有相同的cv-限定。T
.
该死的,如果进入100%的迂腐模式。我甚至不认为该标准要求,在查找... ... const T
应找一个叫 N
,如果 T
有这样的成员。const T
可欺 c_N
代替 N
的对象表示和对齐要求,并与 T
(假设 c_N
是 const decltype(T::N)
type)。我不觉得[basic.type.qualifier]1中的 "版本 "一词有什么规范意义obligation。
INB4你指给我看C++11C++14C++17的[class.name]5说的是
如果一个 类型ef-名称 命名为cv限定的类类型,在使用 班名 是必需的,cv-限定词被忽略。
嵌套名称规范 不需要 班名 (语法上允许两个 班名 和 类型ef-名称). [类.派生]的 基本条款 (→ 基本规格列表 → 基本规格 → 类或十类)做的(语法不允许用 类型ef-名称). 总之,上面引用的这句话在C++20中已经被删除了,原因是 P1131R2 而关于 cv-限定符忽略的措辞被放到了 [class.dedicated] 中,这是唯一适用的地方(在类定义中的基类列表中)。