2015-11-02 10 views
5

固定長文字列の末尾にゼロがないファイル構造があります。 STDとしてのフィールドを初期化する方法::ゼロを付けずに配列 :std :: arrayを初期化する方法末尾の ' 0'を省略した文字列リテラルで<char, N>を初期化する

#pragma pack(push, 1) 
struct Data { 
    // Compiles, but it has an undesired '\0': 
    std::array<char, 6> undesired_number{"12345"}; 
    // Does not compile: 
    std::array<char, 5> number{"12345"}; // stripping '\0' 
}; 
#pragma pack(pop) 
+0

コンパイルエラーとは何ですか?互換性のない型?私は文字列リテラルに基づいて単純にはできないのではないかと心配しています。 –

+3

文字列リテラルを使用して初期化する必要があるのはなぜですか? – Barmar

+0

便宜のために@Barmar –

答えて

11

ヘルパー関数を作る

template <std::size_t N, std::size_t ... Is> 
std::array<char, N - 1> to_array(const char (&a)[N], std::index_sequence<Is...>) 
{ 
    return {{a[Is]...}}; 
} 

template <std::size_t N> 
std::array<char, N - 1> to_array(const char (&a)[N]) 
{ 
    return to_array(a, std::make_index_sequence<N - 1>()); 
} 

そして

struct Data { 
    std::array<char, 5> number{to_array("12345")}; // stripping '\0' 
}; 

Demo

+0

これがリテラルの1つのコピーにコンパイルされるのか、2つ、1つはターミネーターで、もう1つはコンパイルされないのでしょうか。 – luk32

+0

@ luk32は、コンパイラと最適化の設定に依存します。たとえば、O3のg ++​​にはリテラルはまったくありません。 – SergeyA

+0

'make_index_sequence'を手に入れて' std :: array number = to_array( "12345")に変更した後、C++ 11とうまく動作します。 ' –

0

文字列リテラルは(Cとは違って)C++であなたがLength - 1サイズを提供することにより、それを取ることができない、 NUL終端です。従ってを直接とすることもできず、arrayが内部でT[N]であることも考慮してください。

+0

標準では 'array 'は' T [N] 'である必要はありません。何人かは、とにかく 'N> 0'の場合にはそうだと思います。 –

関連する問題