decltype of qualified-id表示类成员的`const T'与嵌套名称规范中的`T'。

问题描述 投票:6回答:1

下面代码中的静态断言要不要火?

#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似乎只保证了 Tconst T 有相同的对象表示和对齐方式,但不是那种 const T的成员与相应的成员具有相同的cv-限定。T.

该死的,如果进入100%的迂腐模式。我甚至不认为该标准要求,在查找... ... const T 应找一个叫 N,如果 T 有这样的成员。const T 可欺 c_N 代替 N 的对象表示和对齐要求,并与 T (假设 c_Nconst 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] 中,这是唯一适用的地方(在类定义中的基类列表中)。

c++ language-lawyer const decltype
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.