7

コンパイル時と実行時の両方で機能する文字列を実装する方法はありますか?

クラスをconstexprで構築するには、簡単なデストラクタが必要です。ただし、文字列を扱う場合、これは難しいことがわかります。文字列がconstexprでない場合は、メモリの割り当てを解除する必要があります。ただし、constexprの場合は、静的に割り当てられているため、削除しないでください。したがって、簡単なデストラクタが許可されます。

ただし、「ねえ、コンパイラ!私がconstexprなら、私を破壊する必要はありません!」と言うことはできません。またはそれは?

次のようになります。

class string {
private:
    char * str;
public:
    template<std::size_t l>
    constexpr string(const char (&s)[l]) : str(&(s[0])) {}
    string(const char * s) { str = strdup(s); }
    static if (object_is_constexpr) {
        ~string() = default;
    }
    else {
        ~string() { free(str); }
    }
};

私が到達できた最も近いものは、stringとconstexpr_stringの2つの別個のタイプ、constexpr_stringを返すユーザー定義のリテラル_string、およびconstexpr_stringからstringへのユーザー定義の暗黙の変換です。

const auto s = "asdf"_string;動作するが動作しないので、これはあまり良くありconst string s = "asdf"_string;ません。さらに、constexpr_stringへの参照/ポインタは変換されません。どちらの方法でも継承すると、直感的でない「落とし穴」が発生し、最初の問題は解決されません。

これは、コンパイラーがconstexprを破棄する必要がないことをプログラマーに信頼させる限り、可能であるように思われます。

誤解がある場合はお知らせください。

4

2 に答える 2

11

破壊だけの問題ではありません。

操作は他の操作constexprのみを呼び出す必要があり、などは ではありません。これは静的にチェックされるプロパティであり、ランタイム引数に依存しないことに注意してください。そのため、そのような関数の呼び出しは完全に存在しない必要があり、(おそらく) 実行されないブランチに隠されているだけではありません。constexprnewmalloc constexpr

そのため、 を取得することは決してできませんconstexpr string

于 2012-05-02T16:18:58.167 に答える
0

このページのコード例をある程度見ることができます。constexprconststrオブジェクトを作成し、それらに対していくつかの操作を呼び出すことはできますが、それらを非型テンプレート パラメーターとして使用することはできません。

于 2015-10-15T08:35:55.997 に答える