2017-03-03 115 views
2

爲什麼構造函數不能被重新定義是否有一個特別的原因?此代碼不會編譯:爲什麼不允許構造函數被重新定義?

class MyClass { 
    public: 
    MyClass() && {} 
}; 

int main() { 
    const auto obj = MyClass(); 
} 

error: constructors may not be ref-qualified

+3

可能因爲這沒有意義。 –

回答

4

Rvalue- this資格的存在是爲了能夠val.func()std::move(val).func()Type().func()區分(前調用&,後者叫&&)。這允許您明確指出func可以從*this的內容移開。

但在構造函數中,您正在初始化該對象。從*this的內容移開是沒有意義的,因爲對象仍在初始化。

因此,想要限定構造函數的唯一可能原因是讓構造函數區分構造一個臨時值和構造一個非臨時值。而這種差異是毫無意義的。而且很危險。

而且有保證的elision,它是自我挫敗。由於感謝C++ 17的有保證的elision,auto val = Typename();根本不會產生臨時性。它只是初始化val,,就好像你已經完成了Typename val();。那麼,何時應該調用構造函數呢?

最後,這是一個無意義的想法。

+0

閱讀關於ref-qualifiers時,只能在臨時上下文中使用的對象的想法起初看起來「很有趣」。謝謝你提到保證的elision。 – lrm29

相關問題