【问题标题】:CRTP and default assignment operatorCRTP 和默认赋值运算符
【发布时间】:2012-11-26 23:34:30
【问题描述】:

如下:

template<typename Derived>
class Base:
{
    inline Derived& operator=(const Base<Derived>& x);
}

这个声明是删除默认的复制赋值运算符还是我有两个运算符:

inline Derived& operator=(const Base<Derived>& x); 
// (declared by me)

inline Base<Derived>& operator=(const Base<Derived>& x); 
// (declared by the compiler)

在这种情况下,当我调用函数时,编译器将如何获得正确的运算符?

【问题讨论】:

    标签: c++ c++11 operator-overloading assignment-operator crtp


    【解决方案1】:

    你试过了吗?仅通过返回类型重载将是一个编译错误,所以我的猜测是定义的那个替换了默认的。

    【讨论】:

    • 只有在代码中实际实例化了模板时才会出现编译器错误。否则,它会编译得很好。
    • @icepack 是的,我假设模板已实例化
    • @icepack 这不是真的。如果无论您传递什么模板参数,模板总是格式错误,那么模板也可以在不实例化的情况下被拒绝。这适用于他的类模板,如果默认赋值运算符也将被实例化。
    • @JohannesSchaub-litb 好点。但是,这是特定于编译器的,不是吗?编译器可以做到这一点的事实并不意味着它会。就生成的二进制代码而言,没问题。
    • @icepack 对。它基本上只不过是未定义的行为。即stackoverflow.com/questions/11589766/…
    【解决方案2】:

    如果你声明 any 方法可以传递给赋值运算符:

    XXX Foo::operator=(Foo&);
    XXX Foo::operator=(Foo const&);
    XXX Foo::operator=(Foo volatile&);
    XXX Foo::operator=(Foo const volatile&);
    

    那么编译器将不会生成默认版本Foo&amp; operator=(Foo const&amp;);

    请注意,返回类型是完全免费的,与其他方法一样。你可以使用voidbool,不管是什么。 惯用(但不是必需的)返回对 self 的引用以允许 赋值链接a = b = c = 0; 这本身源于重载运算符应遵循的准则它们的内置对应物的语义。

    【讨论】:

      猜你喜欢
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      • 2015-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 2018-04-10
      相关资源
      最近更新 更多