0

次のコンストラクターがどのように機能するかを説明するのに役立つ人は誰でも、

class StringData {
  public:
    /**
     * Constructs a StringData explicitly, for the case of a literal whose size is known at
     * compile time.
     */
    struct LiteralTag {};
    template<size_t N>
    StringData( const char (&val)[N], LiteralTag )
        : _data(&val[0]), _size(N-1) {}

private:
    const char* _data;        // is not guaranted to be null terminated 
    mutable size_t _size;     // 'size' does not include the null terminator
}

なぜこのコンストラクタを使用しないのですか?

StringData(const char *c):_data(c){}

完全なソース コードは、http: //api.mongodb.org/cplusplus/1.7.1/stringdata_8h_source.htmlにあります。

4

1 に答える 1

2

サイズがわからないか、実行時にStringData(const char *c):_data(c){}使用してサイズを把握する必要があります。strlenchar 配列が null で終わる (char '\0' で終わる) 場合を除き、これは機能しません。

テンプレート バージョンでは、コンパイラはコンパイル時に配列のサイズを把握し、サイズ メンバーを適切に初期化します。コンストラクターは固定サイズの配列への参照を受け入れ、コンパイラーは、コンストラクターに渡す実際の配列 (およびサイズ) に応じて、一致するコンストラクターをインスタンス化します。これはすべてコンパイル時に行われるため、人的エラーが発生しにくくなります。

于 2013-03-19T03:37:34.217 に答える