gpt4 book ai didi

c++ - 错误 : lvalue required while operator overloading++/-- etc

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

我将我的代码转移到 Ubuntu 4.4.1 g++ 编译器。如下重载 operator++ (int) 时,它会为 (T*) 抛出错误,但对于 (T*&) 可以正常工作.在我的早期版本(linux-64,但不记得确切的版本)中,它也可以与 (T*) 一起正常工作。

任何原因,为什么

template<typename T>
struct Wrap
{
void *p; // Actually 'p' comes from a non-template base class
Wrap<T>& operator ++ ()
{
((T*)p) ++; // throws error; if changed to (T*&) then ok!
return *this;
}
// ...
};
int main ()
{
Wrap<int> c;
++c; // calling prefix increment
}

最佳答案

类型转换的结果不是左值,因此不能将其分配给并且(内置)++ 是一种赋值形式。如果它曾经工作过,那就是编译器中的错误。

引用它编译(实际上它与 *(T**)&p 相同),但由于别名规则(编译器可能假设不同类型的指针(和引用)不t 指向同一个对象)它在形式上是无效的,尽管它适用于所有已知的编译器。

最干净的方式:

p = static_cast<void *>(static_cast<T *>(p) + 1)

(永远不要在 C++ 中使用 C 风格的转换)并依赖编译器能够以与 ++ 完全相同的方式编译它。但是,如果您在定义指针时有可用的模板参数(在您所做的示例代码中),最好只使用正确类型的指针(我会说它也适用于成员指针,但它们没有意义++).

关于c++ - 错误 : lvalue required while operator overloading++/-- etc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5711772/

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