3

今日、私は C++ コードで面白い間違いをしました。std::vector<int>::iterator&タイプ(iおよび)の2つの引数を持つ関数がありますj。イテレータは同じベクトルを指す必要があります。関数はベクトル内の 2 つの数値の合計を返し、両方の反復子をベクトルの j+1 番目の位置に移動する必要があります。

int exp_func_add::evaluate(vector<int>::iterator& i, vector<int>::iterator& j) {
    int result = *i + *j;
    ++j;
    i = j;
    return result;
}

最初に私はこのコードを書きました:

int exp_func_add::evaluate(vector<int>::iterator& i, vector<int>::iterator& j) {
    ++j;
    i = j;
    return (*i+*j); // <====== Oops !
}

returnステートメントが制御を呼び出し元に返すことはわかっています。私の質問は、C++ 標準が遅い値の戻り値のセマンティクスを定義しないのはなぜですか? late_returnそれをキーワードとしましょう:

int exp_func_add::evaluate(vector<int>::iterator& i, vector<int>::iterator& j) {
    late_return *i+*j; // Hold return value but don't go back 
                       // to the caller until leaving scope
    ++j;
    i = j;
}

この質問には何百もの反対票が投じられる可能性があります (建設的ではなく、何とか)。いくつか質問したいのですが:

  1. マクロやその他のトリックを使用してこの動作をシミュレートする方法はありますか?
  2. これは実装に値しますか、それとも次の C++ 標準の機能と見なされますか?
  3. 同様の機能を実装するプログラミング言語はありますか?
4

3 に答える 3

1

私が質問を正しく理解していれば、あなたは本質的に次のようなことをしようとしています:

return *i + *(++j, i=j, j-1);

これに関する問題は、私たちがそれに到達するまでに、がすでに変更されている可能性があることです. このステートメントを左から右に評価するとは限りません (しませんか?)。

他の投稿者が言及しているように、コードを 1 行または 2 行節約できることを除いて、これは実際には言語に追加の利点を提供しません。そうは言っても、逆 コンマ演算子のようなものが必要なように思えます。

存在しませんが、アイデアはここここに持ち込まれました。

全体として、実際には必要ない状況で、かなり複雑になると思います。物事がどのように/なぜ機能するかを理解しようとすることは常に良いことなので、これは悪い質問だとは思いません。この特定のユースケースがそれを正当化するとは思わない。

于 2013-07-14T23:09:14.587 に答える