唯一の「問題」-それを呼び出すことができれば-あなたのコードで見られるのは、すでに定数であるデータを動的に割り当てられたバッファーに不必要にコピーすることで無駄になっていることです(これは正式には定数ですが、実際にはそうではありません) )。これにより、必要な物理メモリの 2 倍が使用され、不要なコピーが行われます。
それは問題ですか?ほぼ間違いなく、いいえ。「かなり制限されたメモリ」システムでさえ、実行時間の観点からもメモリ消費の観点からも、これは最近ではほとんど目立ちません。
例外に関しては、もちろん技術的には、行わなければならない割り当てが失敗std::string
する可能性があるため、コンストラクターがスローする可能性があり、それをキャッチすることはできません。しかし、現実的にしてください。
これが起こらないことはほぼ保証されていますが、たとえそうなったとしても...プログラムの起動中にいくつかの文字列にメモリを割り当てるのと同じくらい些細なことで失敗した場合、まったく異なるスケールで本当に深刻な問題が発生します!
その上、上記の別の回答に対するコメントで指摘されているように、これが起こると仮定すると、あなたはそれについて何をするつもりですか? プログラムはまったく実行できないので、実行できると思われるプログラムを強制終了することに他なりません。
現在、C++17 はそれほど遠くなく、string_view
すでにstd::experimental
いくつかの主流のコンパイラで利用できるようになっているため、別の方法を試すことができます:正しいものを使用してください。
は、string_view
とは逆に、string
非定数メモリを割り当てず、定数データをそこにコピーしてから、定数であると見なします。代わりに、定数データへのポインターを直接管理します。それだけです。
そうすれば、定数は真に (形式的にだけでなく) 定数であり、割り当ても例外の可能性もなく、二重のメモリ使用もありません。そして、ほとんどの場合、見た目も匂いもstring
. 唯一の注目すべき違いは、 astring_view
が nul 終了を保証しないこと (ただし、それが指す文字定数は保証するため、これは無関係です) と、実際には定数であり、変更可能ではないという事実です...これはまさにあなたが望むものです。