C++ 增强变体:绑定顺序中有魔法吗?

C++ 增强变体:绑定顺序中有魔法吗?,c++,boost,boost-variant,C++,Boost,Boost Variant,我一直在阅读我所能找到的一切。(我头痛。)一些人对分配字符串文字被保存为bool感到惊讶。如果我在bool(之后?)之前列出char*,字符串文本会被保存为char*字符串吗?v1和v2之间的顺序在这里重要吗 boost::variant<char*, bool> v1 = "hello"; boost::variant<bool, char*> v2 = "hello"; boost::variant v1=“你好”; boost::variant v2=“hello

我一直在阅读我所能找到的一切。(我头痛。)一些人对分配字符串文字被保存为bool感到惊讶。如果我在
bool
(之后?)之前列出
char*
,字符串文本会被保存为
char*
字符串吗?
v1
v2
之间的顺序在这里重要吗

boost::variant<char*, bool> v1 = "hello";
boost::variant<bool, char*> v2 = "hello";
boost::variant v1=“你好”;
boost::variant v2=“hello”;
对于整数,我应该简单地绑定所有整数的最大整数,还是单独绑定
int8\u t
int64\u t
?如果我把它们都绑定了,然后输入一个,这将适合其中任何一个,它会被保存为第一个(最后一个?)吗

浮动和双浮动怎么样?

没有魔法

这里只记录了构造函数的行为

模板变量(T和操作数)

要求:T必须明确地转换为一种有界类型(即T1、T2等)

后置条件:这是操作数到有界类型之一的最佳转换,由标准重载解析规则确定

抛出:操作数转换为一种有界类型时可能会出现任何异常,导致抛出失败

因为这两种情况都涉及隐式转换,所以可能会构造意外的元素类型

请参见下面的示例

#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());
    }
}
#包括
int main(){
{
boost::变体v;
v=“hello”//is char const(&)[6],转换为bool
断言(0==v.which());
v=静态_cast(“你好”);
断言(0==v.which());
}
//比照
{
boost::变体v;
v=“hello”//is char const(&)[6]
assert(1==v.which());//现在选择直接匹配
v=静态_cast(“你好”);
断言(1==v.which());
}
}

添加了一个更友好的示例,展示了事物如何微妙地相互作用()“我应该绑定最大的整数吗”-取决于是否需要保留该类型。我通常使用“最大整数”方法,但这可能对您的应用程序不好application@odedsh“对于字符串文字使用
std::string
”是什么意思?@sehe:我的意思是在变体中使用char*可能无法达到预期目的。实际字符串不会与变量一起复制,如果没有仔细的内存管理,OP很可能最终会出现分段错误。我理解这与OP的问题没有直接关系,这就是为什么我只是在一篇文章中写它comment@odedsh有道理。事实上,在使用(或不使用)变体时,这并没有什么特别或不同之处。仍然不知道“对于字符串文字使用
std::string
”应该推荐什么。字符串文本存在于代码中,是
字符常量(&)[N]
。事实上,这是在程序的整个生命周期中唯一可以依赖的字符类型…删除注释我想这太不清楚了