【发布时间】:2021-11-25 04:41:31
【问题描述】:
我正在 C++14 中创建 C++17 的 std::optional<class T> 的实现。规范规定,如果T 不是可移动构造的,则移动构造函数应从重载决议中排除,如果T 可简单地移动构造,则移动构造函数应被排除在外。我一直坚持使用前者。
这是我目前所拥有的代码示例:
template<class T, bool = is_trivially_move_constructible_v<T>>
class optional_move_construct : public optional_copy_construct<T> {
public:
optional_move_construct(optional_move_construct&& rhs) :
optional_base<T>() {
if (rhs.m_full) {
_impl_construct(std::move(rhs.m_value));
}
}
};
optional_copy_construct<T> 是我正在使用的继承链的一部分,所以我不会担心。
有两种方法可以“删除”移动构造函数,这两种方法都不适用于这种情况。
选项 1: 删除移动构造函数。这不起作用,因为已删除的函数包含在重载决议中。
选项 2: 使用 SFINAE 从重载决议中排除移动构造函数。这也不起作用,因为 SFINAE 需要一个模板函数才能工作,而且它的优先级低于默认的移动构造函数。
我该怎么做呢?
【问题讨论】:
-
如何让所有其他移动构造函数也依赖于模板,然后除预期类型外禁用它们
-
我认为删除移动构造函数就可以了。
-
你看过[
boost::optional](boost.org/doc/libs/1_78_0/libs/optional/doc/html/index.html)吗?
标签: c++ template-meta-programming overload-resolution