の実装を考えていたところですstd::string::substr
。それは新しいオブジェクトを返しますがstd::string
、これは私には少し無駄に思えます。元の文字列の内容を参照し、暗黙的に に代入できるオブジェクトを返さないのはなぜstd::string
ですか? 実際のコピーの一種の怠惰な評価。このようなクラスは次のようになります。
template <class Ch, class Tr, class A>
class string_ref {
public:
// not important yet, but *looks* like basic_string's for the most part
private:
const basic_string<Ch, Tr, A> &s_;
const size_type pos_;
const size_type len_;
};
このクラスのパブリック インターフェイスは、実際の のすべての読み取り専用操作を模倣するstd::string
ため、シームレスに使用できます。std::string
次に、を受け取る新しいコンストラクターを持つことができるstring_ref
ため、ユーザーは決して賢明ではありません。結果を「保存」しようとすると、コピーが作成されるため、参照がデータを指し、その背後で変更されても、実際の問題はありません。
アイデアは、次のようなコードです。
std::string s1 = "hello world";
std::string s2 = "world";
if(s1.substr(6) == s2) {
std::cout << "match!" << std::endl;
}
合計で 2 つ以下のstd::string
オブジェクトが構築されます。これは、多くの文字列操作を実行するコードにとって便利な最適化のようです。もちろん、これは だけに適用されるのではなくstd::string
、その内容のサブセットを返すことができるすべての型に適用されます。
私の知る限り、これを行う実装はありません。
質問の核心は次のとおりだと思います。
必要に応じて暗黙的に に変換できるクラスが与えられた場合std::string
、ライブラリ作成者がメンバーのプロトタイプを戻り値の型に変更することは標準に準拠していますか? または、より一般的には、ライブラリの作成者は、これらのタイプのケースで、最適化として通常のオブジェクトの代わりに「プロキシ オブジェクト」を返す余裕がありますか?
私の直感では、これは許可されておらず、プロトタイプは正確に一致する必要があります。戻り値の型だけでオーバーロードできないことを考えると、ライブラリの作成者がこれらのタイプの状況を利用する余地はありません。私が言ったように、答えはノーだと思いますが、私は尋ねると思いました:-)。