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

时间:2017-12-15 18:26:55

标签: c++ boost

为什么这段代码会编译?

std::shared_ptr<const int> Bar()
{
    return std::make_shared<int>(123);
}

但这不是......

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

我收到以下错误:

  

无法从'optional&lt; int&gt;'转换'boost :: optional&lt; int&gt;(123)'至   'optional&lt; const int&gt;'

使用gcc 6.3.0并提升1.65.1。

2 个答案:

答案 0 :(得分:1)

import itertools s = '12345' d = '111222333' [''.join(dict(zip(set(d),p))[k] for k in d) for p in itertools.product(s, repeat=len(set(d)))] 有明确的支持,以便这样做。它一般都不起作用。

shared_ptr显然没有这样的支持。

答案 1 :(得分:1)

boost::optional转换构造函数标记为显式。因此,您无法执行从boost::optional<T>boost::optional<U>的隐式转换。您可以执行显式转换:

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

值得注意的是std::optional(在C ++ 17中添加,并且基于boost的版本)只有在包含的类型不是时才转换显式的构造函数隐含可兑换。因此,Foo功能将与std::optional一样正常工作。