gpt4 book ai didi

c++ - 不可移动类的对象不可抛出?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:07:52 25 4
gpt4 key购买 nike

当使用 Clang 3.9.1 或 GCC 6.3.0 编译时抛出可移动但不可复制的对象似乎工作正常:

struct MovableNonCopyable {
MovableNonCopyable();
~MovableNonCopyable();
MovableNonCopyable(MovableNonCopyable &&);
MovableNonCopyable(MovableNonCopyable const &) = delete;
MovableNonCopyable & operator=(MovableNonCopyable &&);
MovableNonCopyable & operator=(MovableNonCopyable const &) = delete;
};

void f() { throw MovableNonCopyable(); }

但是像这样抛出可复制但不可移动的对象:

struct CopyableNonMovable {
CopyableNonMovable();
~CopyableNonMovable();
CopyableNonMovable(CopyableNonMovable &&) = delete;
CopyableNonMovable(CopyableNonMovable const &);
CopyableNonMovable & operator=(CopyableNonMovable &&) = delete;
CopyableNonMovable & operator=(CopyableNonMovable const &);
};

void g() { throw CopyableNonMovable(); }

反而导致编译错误,如:

test.cpp: In function 'void g()':
test.cpp:21:41: error: use of deleted function 'CopyableNonMovable::CopyableNonMovable(CopyableNonMovable&&)'
void g() { throw CopyableNonMovable(); }
^
test.cpp:15:9: note: declared here
CopyableNonMovable(CopyableNonMovable &&) = delete;
^~~~~~~~~~~~~~~~~~

这是为什么?根据[except.throw#5]这应该是另一种方式,即复制构造函数应该是可访问的。

最佳答案

在这里,您明确要求编译器阻止右值对象的构造。

当您抛出临时 CopyableNonMovable() 对象时,编译器会为其必须抛出的“拷贝”寻找合适的构造函数。最适合的声明构造函数是移动构造函数,因为右值最好绑定(bind)到右值引用。它查看声明,将其视为已删除,因此必须拒绝它。

最好的解决方案是简单地不声明移动构造函数,这将使它隐式不生成,因为声明了复制构造函数。在这种情况下,右值将最好地绑定(bind)到对 const CopyableNonMoveable

的引用

关于c++ - 不可移动类的对象不可抛出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41940411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com