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&
和T&&
的构造函数也是如此。所以我希望下面的代码不会编译:
boost::variant<std::string, bool> v = "text";
但是代码编译了,v
变成了布尔值,这是我绝对不想要的。当然,解决方案是将字符串文字包装在 std::string
构造函数中。我的问题是:
-
为什么这段代码会编译?
它如何选择类型(
const char*
可以同时转换为std::string
和bool
)?
【问题讨论】:
当然,在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”流的构造以进行自动类型推断?