読者です 読者をやめる 読者になる 読者になる

VariantからAnsiStringへの暗黙的キャストのバグ(?)

BDS2006でビルド出来ていた古いコードを引っ張り出して、C++Builder2007に食わせたら、こんなメッセージ。('A`)

[BCC32 エラー] OutputLog.cpp(155): E2031 'Variant' から 'AnsiString' へのキャストはできない

QCを調べたら、こんなものが。

AnsiString strValue ;
Variant valValue;

strValue = VarToStr(valValue);   // OK!!    (`・ω・´)シャキーン
strValue = valValue;             // OK!!    (`・ω・´)シャキーン
strValue = AnsiString(valValue); // Error!! (´・ω・`)ショボーン

VarToStrは変換関数だから問題ないけど、暗黙的キャストはOKで、明示的キャストは駄目ってのは一体どういうことなんだ?

気になって、dstring.hを調べてみたところ、確かに、Variantを引数に持つAnsiStringコンストラクタはない。 ただ、sysvari.hには、"operator wchar_t*() const;"があるから、一旦、Variantがwchar_t*に暗黙的キャストされ、さらに、そのwchar_t*が暗黙的キャストでAnsiStringにキャストされると理解していいのかな・・・。 でも、当該部分のコードはBCB6とBDS2006ではコンパイル出来ていたから、CB2007になってコンパイラがの挙動が変わったってことか。

逆(AnsiString→Variant)は"Variant::Variant(const AnsiString& str)"が定義されているから、問題なし。

う〜ん、わけわかめ
まぁ、当該部分を修正してCB2007でもコンパイルできたから、とりあえず問題ないけど。