我在閱讀明確默認和洗掉的特殊成員函式時,看到為了只用f呼叫函式double并避免隱式轉換,可以這樣寫(來自同一頁面):
struct OnlyDouble
{
void f(double) ;
template<class T> void f(T)= delete。
};
有什么理由要寫上面的代碼而不是下面這段代碼呢?
struct OnlyDouble
{
explicit void f(double);
};
有什么區別嗎,或者有什么我不知道的額外行為嗎?
uj5u.com熱心網友回復:
兩件事:
explicit對函式無效,所以explicit void f(double);不會被編譯。explicit并不能阻止引數的隱式轉換。
也就是說,即使比較的物件是:
struct OnlyDouble
{
OnlyDouble(double) 。
template<class T> OnlyDouble(T)= delete。
};
并且
struct OnlyDouble
{
explicit OnlyDouble(double d)>。
};
你是對的,這兩種情況下都會出錯:
OnlyDouble od = 42;
但是下面的內容對第一種情況來說是不符合格式的,對第二種情況來說是符合格式的:
OnlyDouble od(42)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/314176.html
標籤:
