考虑以下类.
struct with_copy {
with_copy() = default;
with_copy(with_copy const&) {}
with_copy& operator=(with_copy const&) { return *this; }
};
struct foo {
with_copy c;
std::unique_ptr<int> p;
};
Run Code Online (Sandbox Code Playgroud)
with_copy有一个拷贝构造函数?是.它是明确定义的.with_copy有一个移动构造函数?不可以.显式复制构造函数阻止生成它.with_copy有删除的移动构造函数?不.没有移动构造函数与删除构造函数不同.删除的移动构造函数会尝试将格式错误而不是退化移动到副本.with_copy复制吗?是.其复制构造函数用于复制.with_copy可移动的?是.它的复制构造函数用于移动.......现在是棘手的.
foo有一个拷贝构造函数?是.它有一个删除的,因为它的默认定义将由于调用unique_ptr已删除的复制构造函数而格式不正确.foo有一个移动构造函数?GCC说是的,clang说没有.foo有删除的移动构造函数?海湾合作委员会和铿锵声说不.foo复制吗?不会.它的复制构造函数被删除.foo可移动的?GCC说是的,clang说没有.(当考虑赋值而不是构造时,行为类似.)
据我所知,海湾合作委员会是正确的.foo应该有一个移动构造函数,在每个成员上执行移动,在这种with_copy情况下退化为副本.Clang的行为似乎很荒谬:我有一个有两个可移动成员的聚合体,但我的聚合物是一个不可移动的砖块.
谁是对的?
c++ user-defined-functions implicit-declaration move-semantics c++11