簡體   English   中英

良好做法:不變為非恆定演員

[英]Good practice: Constant to non-constant cast

當一個函數不修改一個對象參數時,我總是讓它要求一個常量引用,即使引用的對象不是真正的常量。 這是錯的嗎?

對於包裝類,我想寫這個:

template<class B>
class Wrapper{
private:
  B* base_;
public:
  Wrapper(const B& b) { base_ = const_cast<B*>(&b); }
  void ModifyBase();
};

構造函數不會修改基數,因此它要求提供常量引用。

包裝器有一些方法需要修改基類,因此它需要存儲一個非常量指針(因此轉換)。

我覺得我的解決方案不是最好的。

有一個更好的方法嗎?

有沒有公​​認的慣例?

當您選擇參數作為const引用時,您告訴用戶“您可以相信,如果您傳遞給我一個對象,它將不會被[通過此引用]†修改。” 您應該盡可能經常這樣做,因為用戶可以通過查看類型了解更多關於您的功能將會做什么和不會做什么。 此外,傳遞可變引用可能會導致代碼難以推理。

但是,在你的問題中,你的const並沒有說實話。 這是虛擲的const內斯和存儲非const指針-這意味着該對象很可能得到修改。 你欺騙了用戶! 構造函數本身對該對象沒有任何作用並不重要。 它允許其他成員函數修改它。 這是不好的行為。 您的構造函數不應該使用const引用。

不僅如此,但您當前的實現允許未定義的行為。 即使最初聲明為const的對象被賦予Wrapper ,它也不關心。 它拋棄了它的const並允許其他成員函數修改它。 修改最初為const的對象是未定義的行為。

†見6502的評論

它並不真正重要的是, ctor不會改變的對象ctor ,會發生什么情況后, ctor完成就是為什么你需要一個非const對象指針B 所以它與傳入的B對象的所有權和生命周期有關:如果你想獲得所有權(通過& reference,那么對象必須是非const因為它可以被改變。如果你想簡單地復制B傳入的對象,然后不使用引用,按值傳遞並存儲指向副本的指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM