私は、明示的な、しかし安全なキャストを行うことができるように定義された次のテンプレートを持っている:安全な変換* - 一時的な寿命の問題
/// cast using implicit conversions only
template <class To,class From>
inline To safe_cast(const From &from) {return from;}
よく(例えばsprintfのと同様の機能に引数を渡します)このテンプレートを使用して、文字列クラスからCスタイルの文字列への変換を実行したいと思います。しかし、これは一時的なものが渡された場合には不可能であることを示しています。
次の例を検討:obj.GetDebugName(から一時
class Object
{
public:
MyStringClass GetDebugName() const;
};
Object obj;
printf("%s",safe_cast<const char *>(obj.GetDebugName()));
)をsafe_cast中のみ住ん及びポインタときに内部(既に破壊された一時的な文字列のデータの点)が無効ですprintfの。
回避策として、テンプレート呼び出しなしで現在現在使用しているダイレクトキャスト:const char *c = (const char *)(obj.GetDebugName()
がありますが、キャストは不必要に強いので、型の安全性が低下するという欠点があります(obj.GetDebugName()文字列値の代わりにintを返す)。 static_cast
はやや良いかもしれませんが、それでも強すぎると、キャストが安全でないと思われる状況ではエラーが発生します。
1)私が間違っていないとすれば、標準では一時的なライフタイムがステートメントであると言われています(const参照にバインドされている場合を除き、参照の寿命です)。上記のprintfの例を見ると、私は "文"が何であるか、そして私が見た振る舞いが合致しているかどうかは分かりません。ステートメントがprintf全体の場合は、&からのconstの有効期間は短くなります。一時的なものからどのような生涯が期待できますか?誰かが明確にすることはできますか?
2)他にも安全な変換を行う方法はありますか?その結果は有効になるほど長く生き続けますか?
編集:
してください、一般的な質問の種類この多くを検討し、私はこのような変換は、一時的な寿命に関して行うことにすることができる方法のメカニズムのために求めている、私はそれほど興味がありません特定の文字列クラスの特別な場合。
.c_strなどのメンバー関数を使用しない理由を明確にするために、変換コードを型に依存しないようにしたいと思います。この特定の文字列型が知っていることをコードに依存させたくありません。 c_strが実装されている場合、ObjectDebugNameによって別の文字列クラスが返された場合でも、ObjectDebugNameがすでにconst char *を返す場合であっても動作するようにします(.operator const char *()を呼び出す可能性は排除します)。
何もせずに、もし私が聞くことができます。 –
const char * c =(const char *)(obj.GetDebugName())はどうやってやるの? MyStringClassの中にいくつかの "演算子char *"がありますか? – cybevnm
私は誤っているかもしれませんが、式で作成された一時的なものは、式全体の終わり(printfの呼び出し終了)まで生きていませんか? – visitor