gpt4 book ai didi

c++ - 将指针 (T*) 转换或转换为两个常量 (T const * const) 指针

转载 作者:搜寻专家 更新时间:2023-10-31 01:47:19 25 4
gpt4 key购买 nike

C++

我想知道一个指针是否还不是两个- const指针(例如 T const * const )可以隐式或显式转换,通过某些东西(例如函数)处理,或以其他方式转换,以产生 T const * const , 没有或之前用于初始化声明为 T const * const 的变量.我该怎么做?

我想如果我从 T* 开始, 然后一个 const_cast (或两个,以防类型转换一次只能转换一个 const)就足够了,但显然不行。代码中的许多变量显示不同的不成功尝试产生 T const * const通过转换或从函数返回。每次转换都无法返回尾随 const 的指针. (我将 const 左侧的 * 称为前导 const,将 * 右侧的称为尾随 const。)由于转换不成功,我尝试强制执行失败const通过直接初始化。这是在 VC11 中编译的. g++ on stack-crooked.com给出逻辑上等效的控制台输出,尽管 typeid(/*...*/).name() 的名称不同.

#include <iostream>
#include <typeinfo>
using namespace std;

int const * const foo()
{
return nullptr;
}

int main()
{
int x = 7;

auto a1 = &x;
cout << typeid(a1).name() << endl;

auto a2 = const_cast<int const *>(&x);
cout << typeid(a2).name() << endl;

auto a3 = const_cast<int * const>(&x);
cout << typeid(a3).name() << endl;

auto a4 = const_cast<int const * const>(&x);
cout << typeid(a4).name() << endl;

auto a5 = const_cast<int const * const>(a4);
cout << typeid(a5).name() << endl;

auto a6 = (int const * const) &x;
cout << typeid(a6).name() << endl;

auto a7 = static_cast<int const * const>(a4);
cout << typeid(a7).name() << endl;

auto a8 = reinterpret_cast<int const * const>(a4);
cout << typeid(a8).name() << endl;

auto a9 = foo();
cout << typeid(a9).name() << endl;

int const * const a10 = &x;
cout << typeid(a10).name() << endl;
cout << ( typeid(a10) == typeid(a4) ) << endl;

auto a12 = a10;
cout << typeid(a12).name() << endl;
cout << ( typeid(a12) == typeid(a4) ) << endl;
}

预期结果与实际结果,以及问题:

问题编号对应相同编号的a#变量。

  1. 获得预期结果 int *
  2. 获得预期结果 int const *
  3. 预计 int* const , 但得到了 int* .做了 const_cast忽略其尾随 const争论,为什么?由于返回与参数具有相同的常量和类型,因此是否运行了转换?
  4. 预计 int const * const , 但得到了 int const* .做了 const_cast忽略其尾随 const争论和为什么?
  5. 我想看看 const_cast<int const * const>将包含尾随 const在给出参数 a4 的结果中已有领先const .预计 int const * const .得到 int const* .做了 const_cast忽略其尾随 const争论和为什么?
  6. 预计 int const * const .得到 int const* .为什么显式转换仍会排除尾随 const
  7. 预计 int const * const .得到 int const* .为什么 static_cast排除尾随 const
  8. 预计 int const * const .得到 int const* .为什么 reinterpret_cast排除尾随 const
  9. 预计 int const * const .得到 int const* .为什么要初始化到 int const * const函数的返回仍然排除尾随 const结果呢?
  10. 预计 int const * const .得到 int const*来自控制台输出,但不是来自调试器。 a10明确声明为 int const * const ,那么为什么 typeid().name()排除尾随常量? operator==产量 1 ,那为什么是 typeid() a10 本身(不仅仅是名称)相当于a4 ? VC11 调试器列出 a10的类型为 int const * const .为什么它与来自 typeid() 的不同?和 typeid().name() ?哪一个是正确的?
  11. 变量名a11省略,因为它看起来像“全部”这个词。
  12. 我预计 a12成为int const * const因为它被初始化为 a10 , 已明确声明 int const * const . operator==产量 1 , 所以 typeid()还是int const* .得到 int const*来自控制台输出和调试器。为什么它们与预期结果不同?

是否所有强制转换、函数返回和初始化都仅限于一次强制转换 const一次?是龙头const他们唯一可以投入的东西?

最佳答案

const_cast确实按照您认为的方式工作。然而,auto不做你认为它做的事。 auto与函数模板参数推导类似(实际上,它是根据后者定义的)。现在考虑:

template<typename T>
void f(T x);

f(42);
int const n = 42;
f(n);

两个电话都是f<int>() , 不是 f<const int>() .模板参数推导忽略顶级 const 修饰符。同样的道理,在这个例子中

auto a = 42; a = 84;
auto b = n; b = 84;

变量 ab类型为 int , 不是 const int , 可以修改。

关于c++ - 将指针 (T*) 转换或转换为两个常量 (T const * const) 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19341340/

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