7

なぜ次のように印刷されるの"A boolean!"ですか?std :: stringを明示的に作成すると正しい動作が得られるため、奇妙な変換が行われていることに気付きました。visitor::operator()(bool)しかし、次の場合に過負荷解決が選択されるのはなぜですか?

#include <boost/variant.hpp>
#include <string>

typedef boost::variant<bool, std::string> type;

struct visitor : public boost::static_visitor<> {
    void operator()(bool b) const {
        std::cout << "A boolean!" << std::endl;
    }

    void operator()(const std::string& str) const {
        std::cout << "A string!" << std::endl;
    }
};

int main(int argc, char* argv[]) {
    type t = "I am a string";
    t.apply_visitor(visitor());

    return 0;
}

Visual Studio 2012を実行しています(CTPまたは同じ結果が得られない)

4

1 に答える 1

7

t(に減衰するタイプ)で初期化していますconst char*。ポインタのへboolの変換は標準の変換ですが、への変換const char*std::stringユーザー定義の変換です。標準の変換が優先されます。

于 2013-03-26T11:45:23.657 に答える