从非常量到常量模板参数的隐式转换在 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<T const>
一开始似乎不是很有用。这有点像从函数 (T const foo()
) 或例如返回 T const
事实上void bar(int);
和void bar(int const);
是完全相同的函数声明。
【参考方案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
一起使用。
【讨论】:
谢谢。我想我的困惑归结为认为隐含的资格转换也会以某种方式适用于模板参数。回想起来,我意识到这很荒谬,因为 boost::optionalshared_ptr
具有明确的支持,因此可以正常工作。它不仅适用于一般情况。
boost::optional
显然没有这样的支持。
【讨论】:
以上是关于从非常量到常量模板参数的隐式转换在 boost::optional 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章