我有一个指向void *的const引用:
void* p;
void* const& x = p;
我想将其转换为对T *的const引用(对于某些struct T {};
)。在我可以想到的三种方式中,默认选择static_cast
不起作用:
T* const& y = static_cast<T* const&>(x); // doesn't work
T* const& y = reinterpret_cast<T* const&>(x); // works
T* const& y = (T* const&) x; // works
GCC出现以下错误:
error: invalid static_cast from type ‘void* const’ to type ‘T* const&’
T* const& y = static_cast<T* const&>(x);
我想了解它的含义,以及是否有解决方法。
评论和答案中讨论了T* const&
(和void* const&
)是否为
T*
的const引用;或const T*
的引用。评论中的共识似乎是它是选项2。但是从下面的示例中,在我看来,这是选项1。
假设我有一个带有非常量函数T
的类f()
:
struct T
{
void f() {}; // NB: non-const
};
我们可以考虑两种选择:
const T* x;
T* const& y;
通过它们调用f()
会产生不同的效果:
x->f(); // compile-time error (passing ‘const T’ as ‘this’ argument discards qualifiers)
y->f(); // works fine
这是否表明选项1是正确的?有人可以为我调和吗?
答案 0 :(得分:1)
您不能将引用绑定到任何其他类型(除了具有较低的简历资格的相同类型的版本,或者某些涉及通过特殊类型(例如col1
读取单个字节的细微事情)之外的引用。如果您使用col2
(包括通过C样式强制转换)强制解决问题,则使用结果(而不是强制返回)是不确定的行为。
您可以(仅用unsigned char&
即可将reinterpret_cast
值转换为static_cast
,并且可以像
void*
,以便您以后可以在任何地方写入T*
来跟踪const auto y=[&] {return static_cast<T*>(p);};
的当前值。 (由于它按值返回,因此您确实无法根据需要编写p
。)
答案 1 :(得分:0)
看看您不想通过某个指针修改值的原始问题,以下方法应该起作用。对其进行模板化应该得到相同的结果。如有需要,请引入参考,但结果会相同。
void myfunc1(int* intptr)
{
(*intptr)++;
std::cout << "In myfunc1 "<< *intptr<<"\n";
}
void myfunc2(const int* intptr)
{
//(*intptr)++; //modification not possible
std::cout << "In myfunc2 " << *intptr << "\n";
}
int main()
{
int* val = new int;
*val = 32;
void* p = val;
std::cout << "Before myfunc1 " << *val << "\n";
myfunc1(static_cast<int*>(p));
std::cout << "After myfunc1 "<<*val<<"\n";
//no modification via pointer to const
const int* x = static_cast<const int*>(p);
myfunc2(x);
std::cout << "After myfunc2 " << *val << "\n";