noexcept表达与类型特征
noexcept expression vs type traits
我正在学习如何使用条件noexcept
并遇到此问题。假设我有一个课:
template<typename T>
class Wrapper {
public:
Wrapper(T&& value) noexcept(/* ??? */)
: value_(std::move(value))
{}
private:
T value_;
};
对于/* ??? */
零件,我认为我们可以使用noexcept(T(std::move(value)))
或std::is_nothrow_move_constructible<T>::value
,直到我偶然发现它。
因此,如果我使用noexcept(noexcept(T(std::move(value))))
,严格来说,我是说"该构造函数是 noexcept
iff构造和破坏 a T
是 noexcept
?
虽然投掷的破坏者应放火并燃烧。
好问题,另请参阅此语言缺陷讨论。从其名称中,很明显std::is_nothrow_move_constructible<T>::value
应该仅与rvalue的构造相关(但实际上也可能与破坏有关),而noexcept(T(std::move(value)))
始终与构造和破坏有关。
因此,在您的情况下,避免std::is_nothrow_move_constructible
特征的未解决问题的最保存方式是使用新的位置,避免使用std::bad_alloc
(在Chris Beck的评论中提到),并且类似地使用T
'S包装剂的后裔。
template<typename T>
class Wrapper {
public:
Wrapper(T&& value) noexcept(new(nullptr) T(std::move(value)))
: value_(std::move(value))
{}
~Wrapper() noexcept(noexcept(value_.T::~T()))
{}
private:
T value_;
};
相关文章:
- 根据C++标准的定义实现"is_similar"类型特征
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- C ++类型特征:确保子类实现方法
- 根据类型特征更改函数定义?
- 如何使用类型特征将函数的通用引用参数限制为 r 值引用?
- 在C++中创建新的类型特征
- 如何构造一个类型特征,可以判断一个类型的私有方法是否可以在另一个类型的构造函数中调用?
- std::begin-类型特征中未考虑用户定义的重载
- 在类型特征修改后,无法限定类型
- 使用类型特征的部分类专用化
- 为什么不调用预期的函数?我是否对类型特征的理解不正确?
- 了解类型特征的体系结构
- 为什么使用某些类型特征的模板类型会导致模板扣除失败
- 有了C++类型特征,有没有办法避免铸造
- 哪种类型特征表明该类型是可分配的?(元组,对)
- 一种类型特征,标识哪个类提供通过重载解析选择的函数
- 如何使用类型特征正确推断引用的参数
- 如何通过扩展以下类型特征来删除 decltype(&MyClass::funct) 部分?
- 从标准库类型特征继承
- 为什么类型特征不适用于命名空间范围内的类型?