如果一个类有一个成员具有copy ctor,但没有mov ctor,是否会导致包含该成员的类也使用deleted move ctor定义? 在C++ 5版ED中,我没有理解这一点:
例如,假设Y是一个定义自己的复制构造函数但不定义自己的移动构造函数的类:如果一个类有一个成员具有copy ctor,但没有mov ctor,是否会导致包含该成员的类也使用deleted move ctor定义? 在C++ 5版ED中,我没有理解这一点:,c++,c++11,move-semantics,C++,C++11,Move Semantics,例如,假设Y是一个定义自己的复制构造函数但不定义自己的移动构造函数的类: //假设Y是定义自己的复制构造函数而不是移动构造函数的类 struct-hasY{ hasY()=默认值; hasY(hasY&&)=默认值; Y mem;//hasY将有一个已删除的移动构造函数 }; hasY hy,hy2=std::move(hy);//错误:已删除移动构造函数 编译器可以复制Y类型的对象,但不能移动它们。显式地初始化hasY 请求了一个移动构造函数,编译器无法生成该构造函数。因此,草率 将获得一个已
//假设Y是定义自己的复制构造函数而不是移动构造函数的类
struct-hasY{
hasY()=默认值;
hasY(hasY&&)=默认值;
Y mem;//hasY将有一个已删除的移动构造函数
};
hasY hy,hy2=std::move(hy);//错误:已删除移动构造函数
编译器可以复制Y类型的对象,但不能移动它们。显式地初始化hasY
请求了一个移动构造函数,编译器无法生成该构造函数。因此,草率
将获得一个已删除的移动构造函数。草率地遗漏了其行动的声明
构造函数,则编译器根本不会合成hasY-move构造函数。
如果移动操作被定义为
删除
所以我定义了Y
,正如他所说:
struct Y
{
Y() = default;
Y(const Y&){std::cout << "Y's Copy-ctor\n";
Y& operator=(const Y&){std::cout << "Y's copy-assignment operator\n"; return *this;}
};
struct hasY {
hasY() = default;
hasY(hasY&&) noexcept = default;
Y mem; // hasY will have a deleted move constructor
};
- 但是程序运行良好,没有像他说的那样抱怨删除了移动构造函数李>
Y's copy ctor
- 正如您所看到的,尽管我已经在许多具有不同版本和不同编译标志的编译器上测试了该程序,但我的程序运行良好。我想这是书中的一个错误
- 我认为类
是可移动的,其移动构造函数不会被删除,因为该移动构造函数调用隐式未定义(未删除但未定义)的类Y的移动构造函数,所以它会使用Y的复制构造函数,所以我认为类Y可以通过其复制构造函数移动。因此,程序会删除Y的副本hasY
- 我在“隐式定义为已删除操作”和“根本未定义”之间也有歧义?对我来说,被定义为“已删除”就好像是在写:
Y(Y&&) = delete; // generated by the compiler
hasY
的移动构造函数没有被删除,这里有一个简单的例子:
struct hasY {
hasY() = default;
hasY(hasY&&) noexcept = default;
Y mem; // hasY will have a deleted move constructor
std::unique_ptr<int> upi; // This really causes hasY non-copy-able
};
struct-hasY{
hasY()=默认值;
hasY(hasY&&)noexcept=默认值;
Y mem;//hasY将有一个已删除的移动构造函数
std::unique_ptr upi;//这确实会导致不可复制
};
- 正如您所看到的,我添加了一个uniqe_ptr类型的不可复制对象,以防止hasY的复制,并且该程序像以前一样运行,没有erorrs,这意味着hasY的移动构造函数不会被删除
hasY
没有移动构造函数,但它有一个复制构造函数,因此编译器复制对象而不是移动它。@RaymondChen:你确定吗?对不起,误读了。我认为有一个hasY(hasyconst&)=default代码>但是没有。这本书是错误的(正如你自己所证明的)。没有移动构造函数与删除移动构造函数不同。这是否回答了您的问题?
struct hasY {
hasY() = default;
hasY(hasY&&) noexcept = default;
Y mem; // hasY will have a deleted move constructor
std::unique_ptr<int> upi; // This really causes hasY non-copy-able
};