首先,這是一個理智的檢查問題,以便得到某些人更好的認可 - 深入瞭解語言標準的深度。使用用戶自定義構造函數的普通和POD類型
比方說,我有以下幾種類型(雖然我離開了任何非構造函數和非分配成員函數):
template<typename E> struct half_expr
{
};
class half : public half_expr<half>
{
public:
half();
explicit half(float);
template<typename E> half(const half_expr<E>&);
half& operator=(float);
template<typename E> half& operator=(const half_expr<E>&);
private:
half(std::uint16_t, bool);
std::uint16_t data_;
};
好了,任何合理的實施half
不應該在別的內存比普通的std::uint16_t
。但是我對標準的保證感興趣。這是我的理由根據POD的C++ 98/03 defition:
half
不能是POD類型,因爲它是具有非公共字段,基類和用戶定義的構造。
和C++ 11 losened /擴展定義:
它應該是平凡可複製的,因爲它只有隱式生成複製/移動的構造/分配,但是隻有隻要這些
float
和模板版本不以任何方式計算,我不完全確定。還應該標準的佈局,因爲它只有基本類型和單個空非虛擬基類的單個私有字段(這應該是POD在任何標準,是嗎?)
的唯一阻礙POD分類的事情是它不是普通的默認可構造的,這可能通過使用C++ 11的
half() = default
語法來克服。
我很簡單的問題就是:是我的理念完全正確,或是否有我忽視或在定義曲解,尤其是在用戶定義的構造和分配光的任何東西莫名其妙地阻礙分類爲平凡可複製?
注:即使你覺得敦促委託本約POD和標準佈局類型(我可以prefectly理解),簡單的評論回答我的實際問題仍然是不錯的一些可能重複的,因爲這僅僅是一種完整的檢查,可能會對您造成簡單或過度的影響,但我只想保持安全。
這種類型可以在您正確分析時輕鬆複製(但不是微不足道的)和標準佈局,但對於其大小的保證而言,這並不意味着太多。 – 2012-08-12 16:06:12
您的假設可以通過['std :: is_trivially_copyable'](http://en.cppreference.com/w/cpp/types/is_trivially_copyable)和['std :: is_standard_layout'](http:// en.cppreference.com/w/cpp/types/is_standard_layout),當然['std :: is_pod'](http://en.cppreference.com/w/cpp/types/is_pod)。 – 2012-08-12 16:26:55
@JoachimPileborg假設所使用的實現在這方面完全符合標準。 – 2012-08-12 16:31:31