【问题标题】:What type should std::remove_cv produce on an array of const T?std::remove_cv 应该在 const T 数组上产生什么类型?
【发布时间】:2015-03-02 10:36:11
【问题描述】:

std::remove_cv<const int[3]> 应该产生什么类型? int[3]const int[3]?

const int[3]array of 3 const int 对吗?并且没有顶级 cv 限定符。那么它不应该产生const int[3] 吗?我认为最新版本的 gcc/libstdc++ 正在生成int[3]。这是一个错误吗?为什么/为什么不?

【问题讨论】:

  • 虽然这种行为是明智的,但我想知道它是如何合理的......(可以将其解读为const 3 个int 的数组。)
  • 实际上,它将最终使用像 template <typename T> struct remove_cv<T const> { using type = T; }; 这样的专业化。我不认为T const[N] 会匹配那个专业。
  • @DietmarKühl:标准规定“[结果类型] 应与 T 相同,但已删除任何顶级 cv 限定符。”

标签: c++ c++14 typetraits libstdc++


【解决方案1】:

N4140 §3.9.3 [basic.type.qualifier]/p5,强调我的:

应用于数组类型的 Cv 限定符附加到底层 元素类型,所以符号“cv T”,其中T 是一个数组类型, 指一个数组,其元素是如此限定的。 数组类型 其元素是 cv 限定的也被认为具有相同的 cv-qualifications 作为它的元素。 [示例

typedef char CA[5];
typedef const char CC;
CC arr1[5] = { 0 };
const CA arr2 = { 0 };

arr1arr2 的类型都是“5 个 const char 的数组”,并且 数组类型被认为是const-qualified。 —结束示例 ]

另见CWG issue 1059

【讨论】:

    猜你喜欢
    • 2021-06-16
    • 1970-01-01
    • 2021-06-02
    • 2011-10-01
    • 2012-08-02
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    相关资源
    最近更新 更多