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

标签 c++ boost

为什么这段代码可以编译?

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

但这不...

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

我收到以下错误:

could not convert 'boost::optional<int>(123)' from 'optional<int>' to 'optional<const int>'

使用 gcc 6.3.0 和 boost 1.65.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 一起使用.

关于c++ - 从非 const 到 const 模板参数的隐式转换在 boost::optional 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47837956/

相关文章:

c++ - 如何将 vector<T>::iterator(在堆上)转换为 shared_ptr<T>

c++ - Boost.Spirit将表达式转换为AST

稀疏矩阵实现的 C++11 兼容性

python - Matplotlib 从 C++ 绘制多个图表

c++ - 使用 C++ 从文件中读取数据并在命中特定行(字符串)后对特定列求和

c++ - 将依赖于对象的比较器作为模板参数传递,

c++ - std::map 设计:为什么 map 接受比较器作为模板参数

c++ - boost 可以有带整数键的 map 吗?

android - 如何将 C++ 性质添加到 Eclipse Android 项目而不将其转换为 C++ 项目

c++ - 当我尝试使用 tbb 并行我的程序时出现段错误