此代码被拒绝:
const std::optional<int> opt{5};
std::optional<volatile int> opt2 = opt;
但这是被接受的:
const std::optional<int> opt{5};
std::optional<const int> opt2 = opt;
这里发生了什么?
在 /tmp/a.cpp:1 包含的文件中: /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/optional:627:4:错误:没有匹配的函数呼叫“新操作员” ::新的 ^~ /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/optional:1140:10:注意:在函数的实例化中此处请求的模板专业化 'std::_Optional_base_impl >::_M_construct' this->_M_construct(std::forward(__args)...); ^ /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/optional:1002:4:注意:在函数的实例化中此处请求的模板专业化“std::optional::emplace” 就位(*__t); ^ /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/new:134:7:注意:候选函数不可行: 对于第二个参数,没有从 'volatile int *' 到 'const std::nothrow_t' 的已知转换 void* operator new(std::size_t, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT ^ /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/new:143:7:注意:候选函数不可行: 对于第二个参数,没有从 'volatile int *' 到 'std::align_val_t' 的已知转换 void* 运算符 new(std::size_t, std::align_val_t) ^ /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/new:168:14:注意:候选函数不可行: 对于第二个参数,没有从 'volatile int *' 到 'void *' 的已知转换 内联 void* 运算符 new(std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT ^ /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/new:120:7:注意:候选函数不可行: 需要 1 个参数,但提供了 2 个 void* operator new(std::size_t) _GLIBCXX_THROW (std::bad_alloc) ^ /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/new:145:7:注意:候选函数不可行: 需要 3 个参数,但提供了 2 个 void* operator new(std::size_t, std::align_val_t, const std::nothrow_t&) ^ 产生 1 个错误。