今天的守則與前一則([Day 9] Know what functions C++ silently writes and calls)有強烈相關,就直接來看看吧!
這個守則是:
Explicitly disallow the use of compiler-generated functions you do not want
守則本身很好理解,畢竟前一天我們已經看過了C++會幫我們自動產生哪些函式,記得昨天的四大金剛嗎?今天要來看的則是,我們要如何disallow這些不想要的function?
我們已經知道如果我們不宣告,那compiler就會自動幫我們產生copy constructor與copy assignment operator;那我們就宣告吧!這樣compiler就不會產生了;但矛盾的是,既宣告了,那不就可以用了嗎?那如果我就是不想要它可以用,可以怎麼做呢?
首先,記得前一則守則有提到,compiler默默產生的這些function都是public的,那第一個我們能做的就是把它宣告成private的,這樣至少可以避免compiler自動產生,別人也不能隨便call。再來,我們可以不要 定義它! 這樣 link time* 就會出現error!總結以上 宣告為private+不定義它 是很普遍的做法,iostreams library裡面也有用到,現在就打開你電腦裡的STL去看看ios_base
, basic_ios
跟sentry
的實作吧*!
↑以上是本書的內容
But如果你有打開你電腦去看or直接去查,八成會發現我的ios_base
不是這樣寫啊!!!從這邊可以看到
诶?原來這是C++11以前的做法。現在都用delete來搞定啦!
詳情的作法跟區別,可以參考這邊Explicitly Defaulted and Deleted Functions,裡面有非常詳盡的說明。
本章節後面提到的就是C++11以前的做法,就不補充了。看來下次的主題改成CppCon的讀書筆記好了...光看書沒有更新現實情況就尷尬了。
這次就不附上貼心重點提醒了,因為書中提到的做法比較過時;但雖然說這個disallow作法不同,精神並沒有變!還是要記得去關掉它!
std::ios_base
,右鍵go to definition,就可以看到它到底身在何方啦!例如: