- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
在一个玩具类的move构造函数的实现过程中,我注意到一个模式:
array2D(array2D&& that)
{
data_ = that.data_;
that.data_ = 0;
height_ = that.height_;
that.height_ = 0;
width_ = that.width_;
that.width_ = 0;
size_ = that.size_;
that.size_ = 0;
}
模式显然是:
member = that.member;
that.member = 0;
所以我写了一个预处理器宏来让窃取变得不那么冗长和容易出错:
#define STEAL(member) member = that.member; that.member = 0;
现在实现如下:
array2D(array2D&& that)
{
STEAL(data_);
STEAL(height_);
STEAL(width_);
STEAL(size_);
}
这样做有什么缺点吗?有没有不需要预处理器的更清洁的解决方案?
最佳答案
这是推荐的模式:
array2D(array2D&& that)
: data_(std::move(that.data_)),
height_(std::move(that.height_)),
width_(std::move(that.width_)),
size_(std::move(that.size_))
{
that.data_ = 0;
that.height_ = 0;
that.width_ = 0;
that.size_ = 0;
}
如果数据成员是标量类型,自然不需要 std::move
。但是,如果您要复制此模式,则无论如何都包含 move
会很有帮助,这样当成员数据不是标量时, std::move
不会不要忘记。
此外,如果成员数据具有实际的 move 构造函数,那么您可以简单地省略主体:
array2D(array2D&& that)
: data_(std::move(that.data_)),
height_(std::move(that.height_)),
width_(std::move(that.width_)),
size_(std::move(that.size_))
{
}
如果您想推广到没有 move 构造函数但确实具有无资源默认构造状态的类型,您可以:
array2D(array2D&& that)
: data_(std::move(that.data_)),
height_(std::move(that.height_)),
width_(std::move(that.width_)),
size_(std::move(that.size_))
{
that.data_ = Data();
that.height_ = Height();
that.width_ = Width();
that.size_ = Size();
}
我建议按照它们在 array2D
类定义中声明为数据成员的顺序对这些语句进行排序。而且我发现在正文中重复初始化列表没有任何问题。它是必要的第二步。没有必要把它扫到地毯下。
关于c++ - 在 move 构造函数中窃取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6492367/
说我有 some text google 我想给h3附加一个点击事件 $("h3").click(function(){ $(this).slideDown(); return false
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 10年前关闭。 Improve this qu
据说当您使用 ssl 时,您可以防止中间人从服务器窃取信息到客户端,反之亦然。在我的例子中,窃取了 jsonwebtoken。我还从其他答案中了解到,ssl 使用私钥和公钥。私钥存储在服务器上,公钥提
我已经阅读了 Stack Overflow 上的其他问题,但没有找到这个问题的明确答案: 是什么阻止了攻击者通过 JS 窃取用户的 CSRF token ?他不能直接找到 CSRF 元素并用 JS 获
我认为有人在使用 iframe 窃取我的内容。我的网站是一个论坛,一个用户刚刚向我报告了他们。 如果其他人这样做,我如何以编程方式(php、JavaScript、jQuery、HTML)找到他们的网站
我正在使用 SSL 传输所有数据。 HTTP 已完全禁用。除了恶意软件,或者访问某人的物理机器(这两者都很难从服务器端阻止),我不知道攻击者如何窃取登录 cookie。 因此,不用担心窃取登录 coo
有一个 QQuickPaintedItem 带有重载的鼠标事件处理程序: void Plotter::mousePressEvent(QMouseEvent *event) { qDebug(
我正在学习 Caja,我对“this”-stealing 的概念感到困惑: Another security vulnerability that Caja addresses is called “
如果使用客户端流,则回调 URL 包含访问 token 。那么如果回调URL是通过HTTP发送的,是不是很容易被捕获和滥用。 如果我的应用程序的用户 2 获得用户 1 的访问 token ,他就可以访
http://jsfiddle.net/wzew9/ #menu { width: 1001px; height: 34px; padding: 0; margin: 0; b
我实现了 OnTouchEvent(我需要对 Action.MOVE 和 Action.Up 使用react)和 OnClick,但它从未进入 OnClick。 OnTouch 窃取了事件。如何解决这
当 SplashScreen 关闭时(手动或通过 AutoClose),它会在淡出动画期间窃取 MainWindow 的焦点。这会导致主窗口的标题从事件切换到非事件(灰色)再到事件。有什么技巧可以防止
使用其他用户在受信任站点植入的 javascript 函数很容易窃取 session ID cookie。针对这种攻击有哪些可能的反制措施? 在客户端拒绝所有 javascript 脚本可能很困难,因
我有一个网站想要为登录用户提供 YouTube 视频内容(我自己负责以 SSO 方式登录用户)。 因此,我们的想法是视频只能在嵌入到页面中时才能看到(例如以 iFrame 或类似方式)。复制 URL
我在另一个 NSView 中有几个类 MyView(NSView 的子类)的 View 。 MyView 实现 -mouseEntered:, -mouseExited:, -mouseDown:,
我是 flatbuffer 的新手,我想知道是否可以完全(不是 const*)访问 flatbuffers::Vector 中的数据。看看下面的例子,我想窃取 img2::mem::data 的所有权
我有一个带有用户控件的 ASP.Net 页面。页面的提交按钮在用户控件内。页面本身(在用户控件之外)有一个 ImageButton。每当我按回车键提交表单时,它总是执行 ImageButton 单击而
我在Unity中编写了自己的组件,它实现了IBeginDragHandler、IDragHandler和IDropHandler。我想添加一个 UnityEngine.UI 附带的 EventTrig
我最近开始使用 knockout.js 和 sammy.js 来使我的应用现代化。但是我遇到了一些问题。 我在页面上有一些有效链接 - 用户应该实际导航到该位置,而不是使用 sammy.js 模仿导航
我已将 HTML 模板上传到 themeforest,但我发现有些网站免费提供完整的源代码。因为它是 HTML,anycone 可以轻松复制它。如果用户在其他网站(跟踪 IP)上托管我的模板而无需购买
我是一名优秀的程序员,十分优秀!