4

なぜこれが機能しないのか誰かに教えてもらえますか?C ++が値による戻り関数の結果の参照をコンストラクターに自動的に渡すという印象を受けましたが、一致する演算子が見つからないと文句を言います。

class bucket_string {
        public:
            bucket_string();
            bucket_string(bucket_string & rhs);
            bucket_string & operator=(bucket_string & rhs);
            virtual ~bucket_string();

            bucket_string substr(iterator start, iterator end){
                        bucket_string b(str);
                        return b;
                    }
 };



bucket_string bs("the quick brown fox jumps over the lazy dog");
bucket_string bs1 = bs.substr(bs.begin(), bs.end());

次のエラーを返します。

error: no matching function for call to ‘bucket_string::bucket_string(bucket_string)’
note: candidates are: bucket_string::bucket_string(bucket_string&)
      bucket_string::bucket_string()
4

3 に答える 3

7

C ++では、一時値を非定数参照にバインドすることはできません。

関数bucket_string substr(iterator start, iterator end)は一時的なものを返し、コンストラクター/割り当て演算子は非定数参照をパラメーターとして受け取るため、問題が発生します。

constしたがって、不足している指定子をコンストラクターと割り当て演算子に追加する必要があります。そのようです:

bucket_string(const bucket_string& rhs);
bucket_string& operator=(const bucket_string& rhs);

理解を深めるために、このトピックに関する興味深い議論があります。

ちなみに、C ++ 11がオプションの場合は、クラスを移動可能にすることもできます。これにより、一時的な内部リソースを別のインスタンスに転送できます。それがあなたの状況で良いことであるかどうかを言う文脈が欠けています。

次に、これらのメソッドを実装する必要があります。

bucket_string(bucket_string&& other);
bucket_string& operator=(bucket_string&& other);
于 2013-03-26T07:41:56.400 に答える
6

いくつか入れてくださいconst

bucket_string(const bucket_string & rhs);
              ^^^^^
bucket_string & operator=(const bucket_string & rhs);
                          ^^^^^

一時的なconst値をコンストラクターに渡します。constコンパイラーは、参照に対応するコンストラクターを検索しています。

bucket_string bs("the quick brown fox jumps over the lazy dog");
于 2013-03-26T07:37:46.050 に答える
1

コードは、機能しない方法で値と参照のセマンティクスを混合します。substr値で戻りますが、コンストラクターは非定数参照でパラメーターを取ります。非定数であるということは、パラメーターが純粋な値ではなく、変更可能なオブジェクトとして扱われることを示します。言語は、このように参照を使用することを禁じています。引数を変更できないように代入演算子を調整します。

        bucket_string & operator=(bucket_string const & rhs);

これが機能するのは、C ++では一時オブジェクト(関数の戻り値など)をconst参照に渡すことができるためです。

代入操作のソースを実際に変更したい場合は、C++が右辺値参照のソリューションを提供します。const &使用する代わりに&&。ただし、代入はべき等ではなくなるため、ムーブ代入と呼ばれ、一時的でないオブジェクトを使用する場合は別の構文が必要になります。

于 2013-03-26T07:44:55.430 に答える