【问题标题】:Templated assignment operator and self-check模板赋值运算符和自检
【发布时间】:2012-10-04 14:54:39
【问题描述】:

我正在阅读一本关于模板编程的书,其中一个示例包含在模板赋值运算符中进行自检的代码。基本上是这样的:

template <typename T>
class Foo
{
public:

    template <typename O>
    Foo<T> operator= (const Foo<O> & other)
    {
        if ((void *)this == (void *)&other)
        {
            std::cerr << "success" << std::endl;
        }
        else
        {
            std::cerr << "failure" << std::endl;
        }
        return *this
    }
};

现在,据我了解,由于模板化赋值运算符不会阻止生成默认赋值运算符,因此对于 O = T 的情况,将始终选择默认赋值运算符而不是模板化版本。也就是说,在这种情况下,永远不会出现 O = T。

我想知道的是我对此的理解是否正确。如果是,是否存在某种棘手的层次结构(例如,如果我从其他东西派生 Foo 或者如果它是从其他东西派生的)赋值运算符将打印出“成功”?

我已经尝试了几件事,但我真的无法做到。

提前致谢

【问题讨论】:

  • 您错过了 operator= 的返回值。另外,你试过什么?
  • 为什么在发布问题之前没有尝试一下?
  • 好吧,你可以强制它:ideone.com/W3zgy
  • 请注意,模板化 operator= 中的自引用测试已损坏。只有当Foo&lt;O&gt;Foo&lt;T&gt; 位于完全相同的内存位置时,它才会起作用,这不一定是正确的。
  • 抱歉,我编辑了这个问题。是的,我在这里输入了它,但我的终端中确实有一个带有返回码的问题...

标签: c++ templates variable-assignment


【解决方案1】:

要么你是对的,要么 MSVC 11 和 g++ 4.7.1 都搞错了。

即,通常不会调用模板化赋值运算符:将调用自动生成的复制赋值运算符。

要输出“成功”,这样做,并希望编译器使用空基类优化(EBO):

#include <iostream>

template <typename T>
class Foo;

template<> class Foo<void> {};

template <typename T>
class Foo: public Foo< void >
{
public:

    template <typename O>
    void operator=( const Foo<O> & other )
    {
        if ((void *)this == (void *)&other)
        {
            std::cerr << "success" << std::endl;
        }
        else
        {
            std::cerr << "failure" << std::endl;
        }
    }
};

int main()
{
    Foo<int> a, b;

    Foo<void>& v = a;
    a = v;
}

【讨论】:

    猜你喜欢
    • 2019-06-30
    • 2015-01-27
    • 2011-11-14
    • 2020-02-28
    • 1970-01-01
    • 2015-02-25
    • 2011-08-02
    • 2016-05-28
    相关资源
    最近更新 更多