這個問題解釋鏗鏘發生了什麼和std::array
Deleted default constructor. Objects can still be created... sometimes
但隨着gcc
的差異來自於庫代碼。的確有在GCC代碼庫的具體實施細節,是有關這個問題的@StoryTeller mentioned
GCC有std::array
大小爲0的特殊情況,請參見下面的代碼(從GCC 5.4.0
)
他們
<array>
頭
template<typename _Tp, std::size_t _Nm>
struct __array_traits
{
typedef _Tp _Type[_Nm];
static constexpr _Tp&
_S_ref(const _Type& __t, std::size_t __n) noexcept
{ return const_cast<_Tp&>(__t[__n]); }
static constexpr _Tp*
_S_ptr(const _Type& __t) noexcept
{ return const_cast<_Tp*>(__t); }
};
template<typename _Tp>
struct __array_traits<_Tp, 0>
{
struct _Type { };
static constexpr _Tp&
_S_ref(const _Type&, std::size_t) noexcept
{ return *static_cast<_Tp*>(nullptr); }
static constexpr _Tp*
_S_ptr(const _Type&) noexcept
{ return nullptr; }
};
你可以看到,有一個__array_traits
特殊化(在std::array
用於底層數組)當陣列大小爲0,即甚至沒有它的模板上的類型的陣列。類型_Type
不是一個數組,而是一個空的結構!
這就是爲什麼沒有構造函數被調用的原因。
即使有刪除的默認構造函數,聚合初始化也是有效的。但是默認初始化(iirc)不是。我認爲clangs的行爲是合理的。執行或不執行不影響編譯時代碼是否有效。 –
@ JohannesSchaub-litb你期望一個元素被初始化爲一個0大小的數組嗎?鏘做[that](https://wandbox.org/permlink/LashAGkeVwnfsodC),這看起來很瘋狂。如果沒有元素,則不應初始化元素。 – Jamboree
參見[LWG 2157](https://timsong-cpp.github.io/lwg-issues/2157)。 –