次のコードがあります。
#include <string>
#include <ctype.h>
std::string lowerCase(const std::string &exprName)
{
std::string dummy(exprName);
char firstChar = tolower(exprName.at(0));
dummy.replace(0, 1, &firstChar);
return dummy;
}
GDB を使用してコードをステップ実行し、6 行目 (std::string dummy(exprName)) で中断すると、ダミーが空であることが予想されます。しかし、使用して印刷すると
p dummy
GDB は、次の方法で変数の値を出力します。
Breakpoint 1, lowerCase (exprName=...) at Utility.cpp:49
49 std::string dummy("");
(gdb) print dummy
$1 = {
static npos = 18446744073709551615,
_M_dataplus = {
<std::allocator<char>> = {
<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
members of std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Alloc_hider:
_M_p = 0x634261 "Expr * input2 = facade->derefE(facade->varE(v));\nNode * subject = f->"
}
}
また、コードの次の行に進むと、つまり
char firstChar = tolower(exprName.at(0));
そして、GDBに「ダミー」の値を出力します。その値は同じままで、exprNameの値に変わりません。「exprName」を出力しましたが、間違いなく異なる値が含まれています!
これは不可解です!ダミーが exprName と同じ値に初期化されないのはなぜですか?