ルギア君の戯言

雑多な記事。

string型

C++ で非常に便利で活躍してくれるものであるが、気になるのを見付けてしまった。

ret = (string)list.top().d_name + ((ret != "") ? ("/" + ret) : (""));

これは一昨日の総ogg変換のソースの一部何だが、

  1. (string)list.top().d_name は string 型にキャストしているので、string 型。
  2. ret は string 型。
  3. "/" と "" は const char* 型。
  4. operator+(const char*, string); は提供されていないはず (at C++ の規約上)
  5. となれば "/" + ret はエラーになるはず。
  6. でも最適化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]$