0

此代码被拒绝:

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 个错误。
4

0 回答 0