1

C ++ 11では、以下に関して定義された動作はありますか?(つまり、a = 1、2を実行するか、未定義です)

void somefunc(int a, int b) {
  std::cout << a << b << std::endl;
}

int i = 0;
somefunc(++i, ++i)

または私は書くべきです:

int i = 0;
int a = ++i;
int b = ++i;
somefunc(a, b);

私が尋ねる理由は、オプションのファイルを解析していて、ある状況ではキーと値のペアを作成したいからです。そして、次のような機能があります。

std::string create_key(std::string &source, size_t &size, int &index) {
  std:: string key = "";
  while(index < size) {
    // parse the string to create the key
    ++index
  }
  return key;
}

// Value is an base class for a template class. Allowing me to store values 
// of different data types inside a container.
Value* create_value(std::string &source, size_t &size, int &index) {
  Value* value = nullptr;
  while(index < size) {
    // determine type and assign it to value
    ++index;
  }
  return value;
}

std::map<std::string, Value*> create_object(std::string &source, size_t &size, int &index) {
  std::map<std::string, Value*> object;
  while(index < size) {
    // the line I think produces the same issue as my original example
    object.insert(std::pair<std::string, Value*>(create_key(source, size, index), create_value(source, size, index)));
    ++index;
  }
}
4

2 に答える 2

4

はい、同じ変数の別の変更に関して順序付けられていない方法で変数を変更しているためです。コンマはコンマ演算子ではないことに注意してください。これにより、シーケンスが導入され、UB が防止されます。関数の引数を区切るだけです。

あなたもできません

somefunc(i, ++i)

未定義の動作を引き起こすことなく。変数を変更してから、関数を個別に呼び出します (または、必要に応じてその逆を行います)。

于 2012-09-24T02:24:11.230 に答える
2

関数の引数が評価される順序は規定されていません。C++11 5.2.2.Function call para/4状態:

関数が呼び出されると、各パラメーターは対応する引数で初期化されます [注: このような初期化は、相互に不確定な順序で行われます]。

以下を使用する必要があります。

somefunc (i+1, i+2); i += 2;

そして、そのようなことについて心配するのをやめてください。

i他の場所からアクセスできない場合は、修正する必要があるさらに多くの問題が発生します。

于 2012-09-24T02:28:12.157 に答える