C++ で非常に便利で活躍してくれるものであるが、気になるのを見付けてしまった。
ret = (string)list.top().d_name + ((ret != "") ? ("/" + ret) : (""));
これは一昨日の総ogg変換のソースの一部何だが、
- (string)list.top().d_name は string 型にキャストしているので、string 型。
- ret は string 型。
- "/" と "" は const char* 型。
- operator+(const char*, string); は提供されていないはず (at C++ の規約上)
- となれば "/" + ret はエラーになるはず。
- でも最適化0でもエラーにも警告にもならない。(at g++ 4.3.1)
不思議だw
アセンブラソースでも見ないかぎり、これはどうやっているのかわからないんだよね。
ソースレベルデバッガだとステートメント単位だからね。
あ、でも
return "./" + ret;
も通るって言うことは g++ 4.3.1 では
operator+(const char*, string)
が提供されているということか。
(追記)
あった(ぁ)
[lugia@lugia-castle 4.3.1]$ pwd /usr/include/c++/4.3.1 [lugia@lugia-castle 4.3.1]$ cat -n bits/basic_string.h | grep operator+ -A1 (前略) 2099 operator+(const _CharT* __lhs, 2100 const basic_string<_CharT,_Traits,_Alloc>& __rhs); (後略) [lugia@lugia-castle 4.3.1]$