从非常量到常量模板参数的隐式转换在 boost::optional 中不起作用

Posted

技术标签:

【中文标题】从非常量到常量模板参数的隐式转换在 boost::optional 中不起作用【英文标题】:Implicit conversion from non-const to const template parameter does not work in boost::optional 【发布时间】:2017-12-15 18:26:55 【问题描述】:

为什么这段代码会编译?

std::shared_ptr<const int> Bar()

    return std::make_shared<int>(123);

但这并不...

boost::optional<const int> Foo()
    
    return boost::optional<int>(123);

我收到以下错误:

无法将 'boost::optional(123)' 从 'optional' 转换为 '可选'

使用 gcc 6.3.0 和 boost 1.65.1。

【问题讨论】:

值得注意的是,这适用于std::optional boost::optional&lt;T const&gt; 一开始似乎不是很有用。这有点像从函数 (T const foo()) 或例如返回 T const事实上void bar(int);void bar(int const); 是完全相同的函数声明。 【参考方案1】:

boost::optional 的转换构造函数被标记为显式。因此,您不能执行从boost::optional&lt;T&gt;boost::optional&lt;U&gt; 的隐式转换。您可以执行显式转换:

boost::optional<const int> Foo()
    
    return boost::optional<const int>(boost::optional<int>(123));

值得注意的是std::optional(在 C++17 中添加,并且基于 boost 的版本)具有转换构造函数,这些构造函数仅在包含的类型不可隐式转换时才是显式的。因此,您的 Foo 函数可以与 std::optional 一起使用。

【讨论】:

谢谢。我想我的困惑归结为认为隐含的资格转换也会以某种方式适用于模板参数。回想起来,我意识到这很荒谬,因为 boost::optional 和 boost::optional 是不同的类型。【参考方案2】:

shared_ptr 具有明确的支持,因此可以正常工作。它不仅适用于一般情况。

boost::optional显然没有这样的支持。

【讨论】:

以上是关于从非常量到常量模板参数的隐式转换在 boost::optional 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

仅在一个构造函数上的类成员初始化程序中的隐式常量转换 [-Werror=overflow] 溢出

scala学习笔记-隐式转换与隐式参数(18)

从数据类型varbinary到日期SQL服务器的隐式转换

哈希键列的隐式转换导致插入速度非常慢

为啥 Java 和 C# 没有到布尔值的隐式转换?

如何验证某些模板 *not* 为给定的参数类型编译?