相关疑难解决方法(0)

为什么既没有使用clang声明也没有删除移动构造函数?

考虑以下类.

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

16
推荐指数
2
解决办法
1362
查看次数