问题标签 [noncopyable]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
7369 浏览

c++ - 在 C++ 中创建不可复制但可移动的对象

就一个问题。看着 C++ Boost 库(特别是 boost::thread 类),我最终想到:“如何创建一个定义对象的类,这些对象不能被复制但可以从函数中返回?”

考虑这个例子,boost::thread 类具有我之前提到的特性,所以可以这样做:

那么这意味着对象 boost::thread 不能被复制,而是从函数返回,这是可能的。这怎么可能????

我想一定不能提供复制构造函数,但是如何处理从函数返回?它不需要使用复制构造函数吗???

谢谢

0 投票
6 回答
3444 浏览

c++ - 实现提供了复制构造函数和赋值运算符

对于实现(编译器)不提供复制构造函数和复制赋值运算符的情况,我有一点困惑。

  1. 当我们在类中声明复制 ctor 和/或复制赋值运算符时。
  2. 有人说,当我们从具有私有复制 ctor 和/或复制赋值运算符的类派生时。

我对第二种情况有点迷茫,正是第二种情况。
a) 实现不会为您声明它们,因此您将收到编译时错误。
或者
b) 实现将声明和定义它们,但是当编译器定义的实现试图找到基类的方法时,我们会得到一个编译时错误。

我昨天接受了采访,我说它的(b)正在发生,但面试官不同意,他说它的(a)。

我尝试在 Microsoft C/C++ 14.00 和 gcc 4.4.5 中编译以下代码

微软编译器输出

gcc 编译器输出

所以我认为,实现会声明并定义它,但是当编译器定义的实现试图找到基类方法时,我们会得到一个编译时错误。如果我错了,请纠正我。

0 投票
6 回答
4622 浏览

c++ - 为什么 boost::noncopyable 需要继承

将任何不可复制的成员添加到类将阻止复制构造和赋值运算符的自动生成。为什么 boost 需要继承才能使用不可复制?

我认为在我的风格偏好方面我并不孤单

Dave Abrahams 是个聪明人,所以他可能考虑过这种可能性。我错过了什么?继承有什么作用?

0 投票
2 回答
3196 浏览

c++ - 将不可复制的对象放入标准容器

此类是否设计了标准 C++0x 方法来防止复制分配,以保护客户端代码免受意外双重删除data

你注意到了,我在这里定义了新的movemove-assign方法。我是否正确实施了它们?

有什么方法可以 - 使用movemove-assign定义 - 放入DataHolder标准容器中?像一个vector?我该怎么做?

我想知道,我想到了一些选择:

这个emplace_back想法只是一个猜测,在这里。

编辑:为了方便读者,我将答案放入示例代码中。

0 投票
4 回答
368 浏览

c++ - C++ 不可复制,但有时除外

我发现使类不可复制对我的代码质量有很大帮助。最初我使用 boost::noncopyable 进行此操作,但我发现 VC++ 编译器错误不如私有成员有用(双击会导致代码中的错误位置)。

事实上,它提醒我有很多案例是类没有作为参考传递给他们应该有的地方。如此之多,以至于我非常希望即使在只需要复制构造一次的类上也能收到警告。

有没有好的方法来做到这一点?例如,当我真的想复制构造时,我正在考虑将上述两个方法保留为私有并添加一个公共 T(T const&,bool dummy) 构造函数来调用。或者,也可以将上述两种方法公开,并在复制构造时以某种方式激活编译器警告,在我想要的地方抑制警告。

或者也许有更好的方法?

0 投票
1 回答
2383 浏览

c++ - 如何使用初始化列表初始化不可复制的容器?

可能重复:
我可以列出初始化只移动类型的向量吗?

我使用 gcc 4.6.1 编译这段代码

在 g++ 抱怨的内容中,有类似

在这种情况下,似乎 g++ 仍然尝试复制构造函数,尽管我放入初始化列表的是 r 值。那么我怎么能用初始化列表初始化一个不可复制的容器呢?

0 投票
4 回答
908 浏览

c++ - 从 Boost 不可复制派生的类派生的类中是否自动禁止复制?

例如:

Bar不可复制吗?

0 投票
2 回答
742 浏览

c++ - 继承 noncopyable 对 dllexport 类没有影响

更新以下提到的错误已在 VS2012 中修复,并按noncopyable预期工作

这既是一个问题,也是一种提供信息/警告他人的方法,这样他们就不会像我一样落入同一个陷阱:似乎使用noncopyable基类(如 boost 中的基类)在使用时对导出的类没有影响MS 编译器。这是MS 的一个已知错误,但我怀疑有很多程序员知道它。可以想象,这会产生非常讨厌的错误,因为它允许编写甚至不应该编译的代码。示例(此处为不可复制类的代码:)

dll项目中的典型头文件,编译/D EXPORT_IT

源文件:

应用程序:

输出:

1个构造函数,2个析构函数被调用。想象一下当类有效地包含资源时的问题。

编辑 可以编译但不应编译的用例:

其他情况:CantCopyMe MakeIt() { return CantCopyMe(); //致命错误C1001 }

问题

  1. 知识库文章提到了即将发布的版本中的修复。任何人都可以检查这是否已经在 VS2010 中修复(或者可能使用 Visual Studio 11 预览版)?

  2. 是否有任何解决方法来触发任何类型的错误?我尝试(ab)使用编写触发内部编译器错误的事实,return CantCopyMe()但是,我找不到一种方法来仅在编译上述函数时有条件地触发它MakeIt。将 static_assert 放在不可复制的复制构造函数中也不会削减它,因为即使它没有被调用,编译器也会始终编译它。

0 投票
11 回答
39721 浏览

c++ - boost::noncopyable 的优点是什么

为了防止复制一个类,你可以很容易地声明一个私有的复制构造函数/赋值操作符。但是你也可以继承boost::noncopyable

在这种情况下使用 boost 有什么优点/缺点?

0 投票
6 回答
27538 浏览

c# - c#从messagebox.show弹出窗口中选择文本

我已经在 google 和 stackoverflow 上搜索了 2 个小时。必须有一些我只是简单地忽略的东西。有没有一种简单的方法可以在消息框中选择文本?截至目前,当我调用 MessageBox.Show() 时,我无法复制显示的文本。为什么不?我将如何将文本设置为可复制?

我的代码:

我希望能够选择出现的错误消息,以便用户可以将其发送给我,我可以解决他们的问题。任何帮助是极大的赞赏。

编辑:不能使用 crtl-c 方法。我的用户无法理解这个概念。需要用鼠标突出显示并右键单击以选择选项。谢谢你!

编辑:作为参考,我最终做的是混合使用答案。我创建了一个带有单个按钮的弹出窗口,并在将按钮操作复制到剪贴板时。它并不完美,但有了正确的标签,它现在就足够好了。谢谢大家的建议!