Boost变体模糊构造[重复]

Posted

技术标签:

【中文标题】Boost变体模糊构造[重复]【英文标题】:Boost variant ambiguous construction [duplicate] 【发布时间】:2014-09-12 07:21:18 【问题描述】:

Boost Variant 文档说明了以下接受任意类型的构造函数:

template<typename T> variant(T & operand);
要求: T 必须能够明确地转换为有界类型之一(即 T1、T2 等)。

接受const T&amp;T&amp;&amp; 的构造函数也是如此。所以我希望下面的代码不会编译:

boost::variant<std::string, bool> v = "text";

但是代码编译了,v 变成了布尔值,这是我绝对不想要的。当然,解决方案是将字符串文字包装在 std::string 构造函数中。我的问题是:

    为什么这段代码会编译? 它如何选择类型(const char* 可以同时转换为std::stringbool)?

【问题讨论】:

当然,在c++14中使用v = "test"s; 【参考方案1】:

一般来说,用户定义的转换将重载解析过程丢失为标准转换。

有一个从const char 指针到bool 的内置转换,它优于从const char *std::string 的非内置转换(例如,参见Implicit conversions)。

std::string 虽然是标准库的一部分,但不是内置类型,因此只有在转换为内置类型后才考虑其转换构造函数。

一些参考资料:

Why does the compiler choose bool over string for implicit typecast of L""? Why is my overloaded C++ constructor not called?

【讨论】:

以上是关于Boost变体模糊构造[重复]的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以包装 boost“tee”流的构造以进行自动类型推断?

同步变体 [重复]

C++ Boost 变体错误

boost::unordered_map 中以结构为键的 boost 变体

编译时带有 boost::split 的警告[重复]

如何对包装String的枚举变体进行模式匹配? [重复]