C++
我想知道一个不是双const
指针的指针(例如T const * const
)是否可以隐式或显式强制转换,通过某些东西(例如函数)处理,或以其他方式转换,以产生 a T const * const
,不使用或在用于初始化之前一个声明为T const * const
. 我怎样才能做到这一点?
我认为如果我从 a 开始T*
,那么一个const_cast
(或两个,以防演员一次只能投射一个const
)就足够了,但显然它没有。T const * const
代码中的许多变量显示了通过强制转换或从函数返回的不同失败尝试。每个演员都未能返回一个带有尾随的指针const
。(我const
将左侧*
称为前导const
,将右侧*
称为尾随const
。)由于强制转换不成功,我尝试强制const
通过直接初始化但未成功。这是在VC11
. stack-crooked.com 上的 g++提供了逻辑上等效的控制台输出,尽管名称不同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#
变量。
- 得到了预期的结果
int *
- 得到了预期的结果
int const *
- 期待
int* const
,但得到了int*
。是否const_cast
忽略了它的尾随const
论点,为什么?由于返回的常量和类型与参数相同,所以演员表运行了吗? - 期待
int const * const
,但得到了int const*
。是否const_cast
忽略了它的尾随const
论点,为什么? - 鉴于参数已经有一个前导,我想看看是否
const_cast<int const * const>
会在结果中包含一个尾随。预期。得到。是否忽略了它的尾随论点,为什么?const
a4
const
int const * const
int const*
const_cast
const
- 预期
int const * const
。得到int const*
。为什么显式演员仍然会排除尾随const
? - 预期
int const * const
。得到int const*
。为什么要static_cast
排除尾随const
? - 预期
int const * const
。得到int const*
。为什么要reinterpret_cast
排除尾随const
? - 预期
int const * const
。得到int const*
。为什么对int const * const
函数返回的初始化仍然会排除const
结果中的尾随? - 预期
int const * const
。从控制台输出获得int const*
,但不是从调试器获得。a10
被明确声明为int const * const
,那么为什么要typeid().name()
排除尾随 const 呢?operator==
yield1
,那么为什么它typeid()
本身(不仅仅是名称)a10
等同于 ofa4
?VC11 调试器将a10
类型列为int const * const
. 为什么它与 fromtypeid()
and不同typeid().name()
?哪一个是正确的? - 变量名
a11
省略,因为它看起来像单词“all”。 - 我预计
a12
是int const * const
因为它被初始化为a10
,这是明确声明int const * const
的。operator==
产量1
,typeid()
仍然如此int const*
。从控制台int const*
输出和调试器中获得。为什么它们与预期的结果不同?
所有强制转换、函数返回和初始化是否都仅限于一次强制转换const
?领导const
是他们唯一可以投入的吗?