boolとstring

yuki
記事: 5
登録日時: 13年前

boolとstring

投稿記事 by yuki » 13年前

さて、いきなりですがここでクイズです。
以下に二つの、オーバーロードされた関数があります(C++)。

CODE:

void SomeFunction(bool value);                // (1)
void SomeFunction(const std::wstring &value); // (2)
このとき、

CODE:

SomeFunction(L"ほげ");
と呼び出したとき、(1)と(2)のうちどちらの関数が呼び出されるでしょうか。



大多数の人は(2)と答えると思います。
正解は(1)なんです。

それは、何故かというと……。

実は私が一番知りたいです……。
何故なのでしょう。

調べた結果、以下が最適解だと思いました。

CODE:

void SomeFunction(const wchar_t *value)
{
    SomeFunction(wtd::wstring(value));
}

※何度も編集すみません…。
最後に編集したユーザー yuki on 2010年12月03日(金) 22:37 [ 編集 3 回目 ]

アバター
a5ua
記事: 199
登録日時: 13年前

Re: boolとstring

投稿記事 by a5ua » 13年前

「L"ほげ"」を関数の引数に渡すと、その型は「const wchar_t *」ですが、

(1)「const wchar_t *」→「bool」は暗黙のキャストで変換可能
(2)「const wchar_t *」→「std::wstring」は、暗黙のコンストラクタで変換可能

今回のケースでは、暗黙のキャストの(1)が優先されたのだと思います。

ちなみに、以下のように、「Hoge *」は暗黙のうちに「bool」に変換されることがあります。
if (p) ~ // pが0(NULL)でないなら

yuki
記事: 5
登録日時: 13年前

Re: boolとstring

投稿記事 by yuki » 13年前

解説ありがとうございます。
const wchar_t *がboolへ暗黙キャストできるのは初耳でした。
しかし、なぜ「16bit整数値のポインタ」と「サイズ不明の整数値(ポインタではない)」とでどうして暗黙のキャストができるのでしょうか。
どう考えてもできるようには思いませんが……。