C++ 增强变体:绑定顺序中有魔法吗?
我一直在阅读我所能找到的一切。(我头痛。)一些人对分配字符串文字被保存为bool感到惊讶。如果我在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
(之后?)之前列出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]
。事实上,这是在程序的整个生命周期中唯一可以依赖的字符类型…删除注释我想这太不清楚了