gpt4 book ai didi

c++ - 如何通过 remove_cv 函数推断类型(const volatile int* vs const volatile int vs int * const volatile)

转载 作者:行者123 更新时间:2023-11-30 03:55:16 27 4
gpt4 key购买 nike

有一个函数“remove_cv”(http://en.cppreference.com/w/cpp/types/remove_cv)可以删除常量和 volatile 。

我的问题是为什么可以从“const volatile int”移除到“int”从“int * const volatile”到“int*”,但“const volatile int*”与删除之前相同。

The possible code is from the site
template< class T >
struct remove_cv {
typedef typename std::remove_volatile<typename std::remove_const<T>::type>::type type;
};

template< class T > struct remove_const { typedef T type; };
template< class T > struct remove_const<const T> { typedef T type; };


template< class T > struct remove_volatile { typedef T type; };
template< class T > struct remove_volatile<volatile T> { typedef T type; };

我看不懂指针类型推导的规则。你们能告诉我编译器可能如何做的方式吗?扣分有规定吗?

最佳答案

根据描述,这些类移除了topmost cv-qualifiers。

将限定符写在修饰符的右边可以帮助解释这一点(^ 标记顶级):

int const volatile
^
int* const volatile
^
int const volatile*
^

在最后一个示例中,顶层没有 cv 限定符,因此无需删除任何内容。

cv-conversions 的详细信息在 [conv.qual] 中,尽管它不是特别容易理解。它的要点是:

  • 顶级cv-qualifer可以隐式转换为任意组合
  • 在任何其他级别,如果存在 cv 限定符,则必须保留
  • const 必须添加到 cv 限定符不同的级别之上的每个级别。

该标准给出了最后一条规则如何防止无意中更改 const 对象的一个​​很好的例子:

int main() {
const char c = 'c';
char* pc;
const char** pcc = &pc; // #1: not allowed
*pcc = &c;
*pc = 'C'; // #2: modifies a const object
}

上面pcc的声明是无效的,因为最低层的cv-qualifers不同。为了有效,它必须有一个额外的 const 添加到冲突之上的每个级别(尽管不一定是顶层):

const char* const* pcc = &pc;

这会根据需要扩展到尽可能多的级别,以及易变的:

char** pc;
const char*** pcc = &pc; // Invalid
const char* const* const* pcc = &pc; // Ok

char** pc;
char* volatile** pcc = &pc; // Nope
char* volatile* const* pcc = &pc; // OK

关于c++ - 如何通过 remove_cv 函数推断类型(const volatile int* vs const volatile int vs int * const volatile),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29161143/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com