【问题标题】:C++ : why convert to void* before doing a testC++:为什么在进行测试之前转换为 void*
【发布时间】:2016-02-11 15:36:09
【问题描述】:

有谁知道为什么this&op2 这两个指针在比较之前先转换为void*? (本示例取自 C++ 模板:David Vandevoorde 和 Nicolai M. Josuttis 的完整指南)

template<typename T>
template<typename T2>
Stack<T>& operator=(const Stack<T2> & op2){
    if ((void*)this==(void*)&op2){
        return *this;
    }
    // ....
}

【问题讨论】:

  • 因为两个不同类型的指针没有可比性? (但这意味着测试很愚蠢。应该有两个重载,一个用于具有测试的同质类型,一个用于不带测试的混合类型。)
  • 有人能帮我读一下吗?这是一个允许将 Stack 分配给 Stack 的运算符,所以我可以将 Stack 分配给 Stack?检查是看 Stack 是否已经是同一个 Stack?
  • @MobyDisk,只有当Dog 可以分配给Cat 时才有可能。它适用于可以隐式转换的类型。例如,您可以将Stack&lt;int&gt; 分配给Stack&lt;double&gt;
  • @RSahu 你确定吗? stackoverflow.com/questions/4807643/container-covariance-in-c我们对这个Stack类了解不多,但是STL容器不支持你描述的。

标签: c++ pointers


【解决方案1】:

正如@KerrekSB 在评论中提到的,这是一种糟糕的编码风格。

作者试图做的是避免编译时警告比较不同类型的指针,例如Stack&lt;int&gt;*类型的指针和Stack&lt;double&gt;*类型的指针。

使用重载可以很容易地避免这种情况。

// Assign an object of the same type.
template<typename T>
Stack<T>& operator=(const Stack<T> & op2){
    if (this == &op2){
        return *this;
    }
    // ....
}

// Assign an object of a different type.
template<typename T>
template<typename T2>
Stack<T>& operator=(const Stack<T2> & op2){

    // For objects of different types, this check is not necessary
    // at all. It will always be false.
    // if ((void*)this==(void*)&op2){
    //     return *this;
    /// }

    // ....
}

【讨论】:

  • 对于 C,我发现它更适用:该标准不要求两个指向不同对象类型的指针具有可比性。参见c0x.coding-guidelines.com/6.5.9.pdf,第 5-6 页。这是否也适用于 C++,即 > 因为操作数不需要引用相同的对象,所以有必要比较指针值中表示的所有信息(例如,分段架构中的段和偏移量)。 [...]
猜你喜欢
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 2012-02-27
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
相关资源
最近更新 更多