std::map.operator[] に std::map.size() を代入した時の挙動が怖い
助けてください > 闇の軍団の方々
問題のコード
#include <iostream> #include <map> int main() { std::map<int, int> dict; dict[123] = dict.size(); std::cout << "result: " << dict[123] << std::endl; }
実行結果
/Users/arosh/clang clang++ -v Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn) Target: x86_64-apple-darwin11.4.2 Thread model: posix /Users/arosh/clang g++ -v Using built-in specs. Target: i686-apple-darwin11 Configured with: /private/var/tmp/llvmgcc42/llvmgcc42-2336.11~148/src/configure --disable-checking --enable-werror --prefix=/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2 --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-prefix=llvm- --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin11 --enable-llvm=/private/var/tmp/llvmgcc42/llvmgcc42-2336.11~148/dst-llvmCore/Developer/usr/local --program-prefix=i686-apple-darwin11- --host=x86_64-apple-darwin11 --target=i686-apple-darwin11 --with-gxx-include-dir=/usr/include/c++/4.2.1 Thread model: posix gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00) /Users/arosh/clang clang++ -Wall -Wextra map_size.cpp /Users/arosh/clang ./a.out result: 0 /Users/arosh/clang g++ -Wall -Wextra map_size.cpp /Users/arosh/clang ./a.out result: 1
いろいろ教えてもらいました
@shora_kujira16 このテク必要になることぼちぼちあるし、評価順序がマチマチなの嫌ですよね
— きゅうり (@kyuridenamida) March 29, 2013
@shora_kujira16 dict[123]と書いた時点で(123,0)の組が追加されるので、=の左辺と右辺どちらが先に評価されるかによってsize変わります
— くりんぺっと (@climpet) March 29, 2013
@shora_kujira16 ちと面倒ですが、dict.insert(make_pair(123,dict.size()))なら大丈夫です。(dictに123をキーとする要素がないこと前提なら)
— くりんぺっと (@climpet) March 29, 2013