我目前正在用constexpr
構造函數創建一個類,我想知道是否可以使用std::array
來存儲此類的數據。標準是否明確指定std::array
有一個constexpr
構造函數,並且它的內容可以在編譯時被訪問?可以在一個constexpr類中使用std :: array嗎?
回答
因爲std::array<T, N>
是集料,它可以被初始化爲constexpr
當且僅當基礎類型T
具有constexpr
構造(當與每次提供初始化提交)。
基於由@MarkGlisse註釋:本compiles
#include <array>
#include <iostream>
template<typename T, std::size_t N>
struct X
{
constexpr X(const std::array<T,N>& a):arr(a){}
private:
std::array<T,N> arr;
};
constexpr std::array<int,2> a {{ 13, 18 }};
constexpr X<int,2> x = a;
int main()
{
}
我相信我已經找到了從這裏的標準的相關報價:
12.1構造函數[class.ctor]
6默認的默認構造函數是默認的,並且未定義爲已刪除,當它是od時隱式定義的爲 破壞(3.2)以創建其類型爲(012)的對象,或者在其聲明的第一個 聲明後明確默認。隱式定義的默認構造函數執行該類的初始化集 用戶編寫的默認構造函數,該類沒有 ctor-initializer(12.6.2)和一個空的複合語句。如果用戶編寫的默認構造函數 不合格,則該程序爲 不合格。如果用戶編寫的默認構造函數滿足constexpr構造函數的要求(7.1.5),則隱式定義的默認構造函數爲constexpr。
這看起來基本上就像@ BenVoigt的答案。
'的#include
@MarcGlisse嘗試在'a'和'X'前添加'constexpr',它不會編譯! – TemplateRex
'的#include
- 1. 可以在PHP中使用array [key]嗎?
- 2. 是std :: array可移動嗎?
- 3. 使用begin()和end()可以創建std :: array嗎?
- 4. 我可以在Array()中使用兩個引號嗎?
- 5. 在這種情況下可以使用std :: array(或boost :: array),還是我堅持使用std :: vector和native數組?
- 6. 可以在多個DLL中使用std :: error_category嗎?
- 7. 我可以在一個類中使用多個ActionListeners嗎?
- 8. 可以在同一個分類器中使用多個ngram嗎?
- 9. 在std :: array上使用std :: extent
- 10. constexpr std ::可選的可能實現
- 11. C++ NetBeans std :: array不可用
- 12. 一個constexpr函數可以調用一個返回void的函數嗎?
- 13. 我可以使用std :: pair作爲std :: multimap中的鍵嗎?
- 14. 在std :: ostream上可以使用std :: back_insert_iterator嗎?
- 15. 你可以在`std :: unique_ptr`的容器上使用`std :: remove_if`嗎?
- 16. std :: function可以使用函子嗎?
- 17. 我可以在一個類的方法中使用multiprocessing.Pool嗎?
- 18. constexpr的std ::陣列static_assert
- 19. 在結構中包含一個std :: map?可以嗎?
- 20. 可以在一個類中使用Remoting
- 21. std :: vector可以='d到另一個std :: vector嗎?
- 22. 在PHP類中使用GetText可以嗎?
- 23. MvcMailer可以在類庫中使用嗎?
- 24. 爲什麼不是std :: array的operator ==()標記爲constexpr?
- 25. 一個類可以使用在其某個類別中聲明的方法嗎?
- 26. C++ - 你可以假設類型* = std :: array <type> :: iterator?
- 27. 引用不同大小的std :: array而不是基類中的std :: array
- 28. constexpr陣列和std :: initializer_list
- 29. 你可以在第三方DLL中使用std :: string嗎?
- 30. 我可以在boost中使用std :: function(C++ 11 lambda)嗎?
'std :: array'沒有一個'constexpr'構造函數,就我所知儘可能 –
'std :: array'沒有(用戶定義的)構造函數。這是一個聚合。 – chris
請注意,雖然您可以存儲數據,但您將難以用constexpr方式提取數據。 –