2012-12-09 170 views
3

在下面:CRTP和默認的賦值運算符

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) 

在這種情況下,當我調用函數時,編譯器將如何獲得正確的運算符?

回答

3

如果聲明任何方法,可以通過一個賦值運算符:

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

那麼編譯器不會生成默認版本Foo& operator=(Foo const&);

請注意,返回類型是完全免費的,對於其他方法。無論真的如何,你都可以使用void,bool。這只是慣用的(但不是必需的)返回一個引用自我,以便允許分配鏈接a = b = c = 0;本身源自重載操作符應遵循其內置對應語義的指導原則。

1

你試過了嗎?僅通過返回類型重載將是一個編譯錯誤,所以我的猜測是定義的替換了默認值。

+0

只有當模板實際在代碼中實例化時,它纔會出現編譯器錯誤。否則,它會編譯得很好。 – SomeWittyUsername

+0

@icepack是真的,即時假設模板實例化 –

+1

@icepack這是不正確的。如果一個模板總是格格不入,而不管你傳遞了什麼樣的模板參數,那麼模板可以被拒絕而不需要實例化。這適用於他的類模板,如果默認賦值運算符也會被實例化。 –