提升变体模糊结构

pet*_*ohn 8 c++ boost boost-variant

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

template<typename T> variant(T & operand);
Run Code Online (Sandbox Code Playgroud)
  • 要求: T必须明确地转换为有界类型之一(即T1,T2等).

构造函数接受const T&和的情况也是如此T&&.所以我希望以下代码不会编译:

boost::variant<std::string, bool> v = "text";
Run Code Online (Sandbox Code Playgroud)

但代码编译,并v成为一个布尔,这是我绝对不想要的东西.当然,解决方案是将字符串文字包装在std::string构造函数中.我的问题是:

  1. 为什么这段代码会编译?
  2. 它是如何选择的类型(const char*可转换为两个std::stringbool)?

man*_*lio 2

通常,用户定义的转换会丢失标准转换的重载解析过程。

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

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

一些参考: