为什么这段代码会编译?
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。
答案 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
一样正常工作。