2014-02-18 56 views
3

我試圖對模板參數進行靜態斷言,以檢查/強制Type複製可構造。然而,靜態斷言失敗。我不明白爲什麼,也找不到任何文件,爲什麼它會在靜態評估中失敗。爲什麼模板參數上的is_copy_constructible靜態斷言失敗?

實例化的類是複製可構造的,但它使用了我認爲稱爲好奇地重現的模板參數模式。

下面是整個測試代碼:不出所料

結果:

10 
test 
1 

這意味着通過了第2個斷言。所以看起來Fun不是內的CopyConstructible。然而,is_copyable說這是。

我也嘗試更改is_copyable()方法使用bool在課堂上初始化它使第二個斷言失敗。當阻止斷言被刪除時,值爲copyable被設置爲0;

似乎只有評估失敗是基類內的靜態copmile-time。

Q1爲什麼編譯時檢查false和「運行時」true?它是否因爲類(Fun)未在檢查時完全實例化/定義而失敗?

Q2這是預期嗎? (is_copy_constructible的靜態評估結果比不同的「運行時間」評估結果)。

Q3有沒有辦法編譯時斷言,檢查類是CopyConstructible這樣的設計?

測試在叮噹3.2-11,gcc 4.8.2和ideone默認的C++ 11編譯器。

+0

你可以製作一個較短的測試用例並只詢問一個問題嗎? –

+0

@KerrekSB我認爲問題1和問題2是高度相關的,我可以放棄第3個問題,因爲它會問及解決問題的方法。很難將其縮短並展示每一種行爲。你有什麼建議嗎? (我不確定是否需要operator =,因此可能會將其刪除。) – luk32

回答

6

Q1爲什麼編譯時檢查爲false並且「run-time」爲true?它是否因爲類(Fun)在檢查時未完全實例化/定義而失敗?

是的。 FunContainer<Fun>Fun被定義之前被實例化,當你使用它作爲Fun的基類時。

Q2這是預期嗎?

是的。

Q3有沒有一種方法,使一個編譯時斷言會檢查是否類是可複製構造類似的設計呢?

將您的靜態斷言移到稍後實例化的地方。 的構造函數對我來說似乎是一個不錯的選擇。

+0

感謝將斷言移入構造函數的建議。我猜** ** Q2 **的答案是「是」的原因是因爲在我放置該支票的地方,「Fun(const Fun&)」將被非法呼叫,即「Fun」不能在實例化時被複制'FunContainer',因爲它還不是一個完整的類型,對嗎? – luk32

+0

@ luk32排序,是的,儘管在這一點上幾乎沒有辦法真正複製一個「Fun」對象,因爲你不在函數內部。 – hvd

+0

那麼,爲什麼它會給出「錯誤」,沒有一個編譯器會說「這是一個不好的地方複製對象,所以檢查是無意義的/錯誤的」。 – luk32