相关疑难解决方法(0)

默认的Move构造函数是否定义为noexcept?

在重新分配时,在确定是否移动或复制元素之前,向量将检查移动构造函数是否标记为noexcept.默认移动构造函数是否定义为noexcept?我看到了以下文档,但没有说明这一点.http://en.cppreference.com/w/cpp/language/move_constructor

隐式声明的移动构造函数

如果没有为类类型(结构,类或联合)提供用户定义的移动构造函数,并且满足以下所有条件:没有用户声明的复制构造函数没有用户声明的复制赋值运算符没有用户声明的移动赋值运算符没有用户声明的析构函数,由于下一节中详述的条件,隐式声明的移动构造函数未定义为已删除,因此编译器将声明移动构造函数作为其类的内联公共成员signature T :: T(T &&)一个类可以有多个移动构造函数,例如T :: T(const T &&)和T :: T(T &&).如果存在一些用户定义的移动构造函数,则用户仍可以使用关键字default强制生成隐式声明的移动构造函数.

c++ constructor move-semantics c++11

64
推荐指数
1
解决办法
1万
查看次数

默认定义的移动构造函数的noexcept规则是什么?

特别是std::vector与其相关的是,类型noexcept在可能的情况下是可移动的.

所以在声明= default像in 的移动构造函数时

struct Object1
{
    Object1(Object1 &&other) = default;
};
Run Code Online (Sandbox Code Playgroud)

std::is_nothrow_move_constructible<Object1>::value将是true每个成员(0在这里)Object1是nothrow-move-constructible,这在这里得到解答.

然而,如果仅声明移动复制构造函数,然后= default在以下代码中进行定义,会发生什么?

struct Object2
{
    Object2(Object2 &&other);
};
Object2::Object2(Object2 &&other) = default;
Run Code Online (Sandbox Code Playgroud)

随着G ++ 4.9.2 std::is_nothrow_move_constructible<Object2>::valuefalse,我要纪念这两个声明和定义noexcept,使其true.

现在我感兴趣的是实际规则是什么.特别是因为有效的现代C++中的第22项(Scott Meyers)似乎通过建议像我一样实现了pimpl-idiom移动构造函数来提供错误的建议Object2.

c++ pimpl-idiom move-semantics noexcept c++11

16
推荐指数
1
解决办法
1464
查看次数

标签 统计

c++ ×2

c++11 ×2

move-semantics ×2

constructor ×1

noexcept ×1

pimpl-idiom ×1