2015-10-05 68 views
1

我有下面的代碼可以編譯和行爲預期:constexpr構造對象與私有成員

struct A 
{ 
    //private: 
     int v; 

    friend constexpr A f(int v); 
}; 

constexpr A f(int v) 
{ 
    return A{v}; 
} 

constexpr A operator""_A(unsigned long long v) 
{ 
    return f(static_cast<int>(v)); 
} 

我可以構建A類型的對象是這樣的:

auto a = 1_A; 

如果我做值A::v私有我編譯錯誤

No matching constructor for initialization of 'A'

如果我添加const ructor到A,我得到一個不同的copilation錯誤:

Constexpr function's return type 'A' is not a literal type

有沒有一種方法,使A::v私有,仍然有constexpr函數來構造A類型的對象?

+0

你能展示你添加的ctor嗎?它是「constexpr」嗎? – Angew

+0

@Angew不,它不是......謝謝:)這是問題 - 從constexpr中調用非constexpr函數... – Felics

回答

2

類是一文本類型,如果:

  • 它有一個簡單的析構函數
  • 它是一個聚集體,或者其具有至少一個非複製的,非移動constexpr構造
  • 它的所有基類和非靜態成員都是非易失性文字類型

因此,當向想要成爲文字的類添加構造函數時類型,您必須將該構造函數標記爲constexpr