コンパイル時と実行時の両方で機能する文字列を実装する方法はありますか?
クラスを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を破棄する必要がないことをプログラマーに信頼させる限り、可能であるように思われます。
誤解がある場合はお知らせください。