2012-02-24 97 views
2

我需要使用std::is_assignable類型特徵,這種特徵在我想支持的最老的編譯器版本中不可用。由於我必須自己實現(好吧,我承認它,有一些interwebs偷看),我現在想知道這是我的實現中的錯誤還是std::is_assignable的一般問題。爲什麼具有const成員的結構可賦值?

首先,這是我的測試結構:

struct Bar { 
    bool const cb; // this should kill the default assignment operator 
    int i; 
}; 

,這裏是我的stdreplace::is_assignable

template <typename T> struct is_assignable : private std::__sfinae_types { 
    private: 
    template <typename T1> 
     static decltype(std::declval<T1>() = std::declval<T1>(),__one()) test(int); 
    template <typename T1> 
     static __two test(...); 
    public: 
    static bool const value = sizeof(test<T>(0)) == sizeof(__one); 
}; 

然而,它告訴我,Bar是分配:

int: 1 
Bar: 1 
int[2]: 0 

哪裏有問題?

+0

你有沒有嘗試改變你的布爾變量名稱是別的而不是保留關鍵字? – 2012-02-24 05:26:13

+0

@pwny:哦,男孩。這是在問題*中的拼寫錯誤*,因爲我手工輸入了「Bar」結構。我糾正了這個問題,**謝謝**! – bitmask 2012-02-24 05:29:02

+0

呵呵所有的好處我只是確保這不是一個奇怪的編譯器技巧,因爲這個。 – 2012-02-24 05:31:22

回答

3

您的編譯器可能未正確定義爲已刪除的賦值運算符。在關於隱式聲明的特殊成員函數的C++ 03代碼中,即使賦值在評估操作數中出現時的分配格式不正確,在未評估操作數內的分配也可以。其原因是因爲調度操作符永遠不會被隱式定義,而只會被隱式聲明,從而不會產生錯誤。

由於在C++ 11中進行了更改,並且您的賦值運算符應該被自動刪除,所以在我看來您的編譯器有問題。

+0

我明白了。我同樣懷疑,因爲進一步的調查和不同的嘗試讓人感覺不如以前,感謝您的確認。我會提交一份錯誤報告,但顯然它已經在更新版本中修復了。 – bitmask 2012-02-24 09:21:13

相關問題