提升变体:绑定顺序中有魔力吗?

时间:2015-01-22 15:58:02

标签: c++ boost boost-variant

我一直在阅读有关Boost Variant的所有信息。 (我很头疼。)有些人感到惊讶的是,分配字符串文字被保存为bool。如果我在char*(之后?)之前列出了bool,那么字符串文字会保存为char*字符串吗? v1v2之间的排序是否重要?

boost::variant<char*, bool> v1 = "hello";
boost::variant<bool, char*> v2 = "hello";

对于整数,我应该只为所有整数绑定最大的整数,还是应该单独绑定int8_tint64_t?如果我将它们全部绑定然后输入一个适合其中任何一个,它会被保存为第一个(最后一个?)吗?

float vs double怎么样?

1 个答案:

答案 0 :(得分:2)

没有魔力。

只有构造函数的记录行为。

  

template<typename T> variant(T & operand);

     

需要:T必须明确可转换为其中一种有界类型(即T1,T2等)。

     

后置条件:*这是操作数到其中一个有界类型的最佳转换,由标准重载决策规则决定。

     

引发:可能会因操作数转换为其中一个有界类型而导致任何异常失败。

由于两种情况都涉及隐式转换,因此可能会构造出意外的元素类型。

见下面的例子

<强> Live On Coliru

#include <boost/variant.hpp>

int main() {
    {
        boost::variant<bool, std::string> v;
        v = "hello"; // is char const(&)[6], converts to bool

        assert(0 == v.which());

        v = static_cast<char const*>("hello");
        assert(0 == v.which());
    }

    // compare to
    {
        boost::variant<bool, char const*> v;
        v = "hello"; // is char const(&)[6]

        assert(1 == v.which()); // now selects the direct match

        v = static_cast<char const*>("hello");
        assert(1 == v.which());
    }
}