2012-12-04 19 views
2

簡化版初始化與用戶定義的字面

class C { 
public: 
static constexpr std::array<C, 2> foo {{"1"_C, "2"_C}}; 
int x; 
constexpr C(char c) { x=c; } 
} 
constexpr C operator"" _C(const char * str, size_t n) { return C(*str); } 

這並不飛constexpr陣列,因爲文字沒有在其中將陣列限定的線的理解。但是,自由文字函數不能提前移動,因爲C不知道。

是否有解決這個Gordian結,不涉及在代碼中添加可變參數模板或類似的東西?

+3

可變參數模板和可怕的不應該在同一個句子! :) – GManNickG

+1

作爲一個側面說明,我不認爲'_C'是一個允許的名稱,因爲它是下劃線+大寫字母,它是爲實現保留的。 – Xeo

+1

@Xeo:我認爲'_C'是一個標識符,而不是一個名稱,因爲[在這裏討論](http://stackoverflow.com/questions/7947925/when-is-an-identifier-a-name-in- c),所以沒關係。該名稱將是「運營商」「_C」。 –

回答

3

該問題並不真正在於用戶定義的文字,但事實上std::array需要完整的類型(或者真的,任何constexpr初始化)。下面的代碼也將無法編譯:

#include <array> 

class C { 
public: 
static constexpr std::array<C, 2> foo {{C('1'), C('2')}}; 
int x; 
constexpr C(char c) : x(c) {} // please use a mem-initializer-list 
}; 

有錯誤的相似(3.3鏘這裏SVN):

 
/usr/include/c++/v1/array:136:16: error: field has incomplete type 'value_type' 
     (aka 'C') 
    value_type __elems_[_Size > 0 ? _Size : 1]; 
      ^
t.cpp:5:36: note: in instantiation of template class 'std::__1::array' 
     requested here 
static constexpr std::array<C, 2> foo {{C('1'), C('2')}}; 
           ^
t.cpp:3:7: note: definition of 'C' is not complete until the closing '}' 
class C { 
    ^
+0

將對象移到相關的類。也許我應該把它當作一個設計問題。 –