问题标签 [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 投票
1 回答
122 浏览

c++ - 带有自定义析构函数的“不可复制”

我需要一个noncopyable具有声明析构函数的类,而天真的方法不起作用:请参阅https://ideone.com/mU8aoc。析构函数有什么问题,为什么移动与没有它的方式不同?当然,如何解决它?

作为参考,完整的代码(与ideone上面的链接相同):

0 投票
0 回答
71 浏览

c++ - 从 boost::noncopyable 继承与删除复制 ctor 和 op 有什么缺点吗?

第一的:

第二:

他们是一样的吗?各有什么缺点?我的意思是运行时成本,而不是编写代码的舒适度或可读性。

在 2016 年使用 C++11/14boost::noncopyable代替 C++11有什么优势= delete吗?

0 投票
1 回答
131 浏览

c++11 - std::unordered_map < K, boost::ptr_deque < T > > 的 operator[] (K const &) 和 emplace 的区别

在上面的示例中,注释掉的行不会编译,因为它们试图复制ptr_deque不可复制的元素。但是,push_back表格有效。

我在想那operator [] (K const &)只是return emplace(k, mapped_type()).first->secondor return insert(value_type(k, mapped_type())).first->second,本质上是注释掉的语句

显然情况并非如此。是否在内部operator []执行一些placement new魔术?

还是有什么特别之处ptr_deque

我正在使用 gcc-6.1 & boost 1.59

0 投票
4 回答
1878 浏览

c++ - 具有不可复制不可移动元素类型的 C++ 容器

我需要一个既不能复制也不能移动的元素容器。这些元素不是默认可构造的,但它们的构造函数得到相同的参数。

容器的大小在其生命周期内不会改变。它应该像内置数组一样简单,但它的大小是在运行时调用构造函数时确定的。

有没有一种简单的方法来实现它而不会产生内存分配和间接使用的开销std::vector<std::unique_ptr<T>>

0 投票
4 回答
340 浏览

c++ - 使类不可复制:私有未定义方法与已删除方法

在 C++11 之前,我看到过这样的代码:

对于 C++11(及更高版本),我看到如下代码:

它们的行为是否相同?如果不是,请解释。

参考:https ://ariya.io/2015/01/c-class-and-preventing-object-copy

0 投票
1 回答
458 浏览

c++ - 将具有不可复制字段的对象插入 std::vector

我知道以下代码无法编译,因为 A 的移动构造函数被删除,因为互斥锁不可移动。

但是,如果我希望A将我的存储在 std 容器中,我应该怎么做呢?我很乐意A在容器“内部”建造。

0 投票
1 回答
335 浏览

c++ - 在向量中放置派生的可移动但不可复制的会产生编译错误

我在尝试emplace_back使用带有微妙继承扭曲的不可复制但可移动对象的向量时遇到编译器错误,据我所知,这不会改变问题。

这是合法的 C++ 并且这是 Visual Studio 2015 的错误,还是我犯了一个明显的错误?

输出 :

如果没有继承,即在 Test 中删除了复制构造函数并且没有基类,它可以正确编译。
不知何故,删除移动构造函数中的默认值使其也可以正确编译,但是我必须定义移动构造函数并且我不想去那里。

这意味着这编译得很好:

令人费解?

0 投票
1 回答
71 浏览

c++ - C++:使用 std::cin 的多个副本?

我正在编写一个简单的通用解析器组合库。这意味着该库包含许多称为解析器的小函数对象,它们(在调用时)将字符串作为输入并返回 ParseResults 列表作为输出,其中 ParseResult 是

template <typename A> using ParseResult = std::pair<A, std::string> 如果解析器不匹配,则列表为空,如果匹配则包含单个结果,并且某些可能以多种(不明确)方式匹配的解析器可能会返回更多结果。

但是,这意味着现在正在进行大量的字符串复制。此外,在开始时,最终构造的解析器需要用一个字符串调用,因此所有std::cin(或文件的竞争内容)都被复制到一个字符串中。

似乎更好的主意(因为解析器只查看字符串当前前面的第一个(几个)字符),是跟踪您现在在标准输入流中的位置。我相信这正是 astd::istream的样子。但是,istream 是不可复制的。如何解决我的问题?有没有办法返回一个 istream 的副本,该副本指向原来指向的几个字符?还是有另一种更清洁的方法来解决这个问题?

0 投票
1 回答
1282 浏览

c++ - 如何创建具有不可复制和不可分配对象的向量?

我有一堂课

我正在尝试创建 A 类型对象的向量

这会导致对已删除的构造函数的编译错误调用'std::unique_ptr<A, std::default_delete<A> >'

0 投票
4 回答
1484 浏览

c++ - 私有继承是否总是意味着“HAS-A”?

根据我最喜欢的作家Scott Meyers 先生的说法,私有继承和组合意味着同样的事情,也就是 Has-A 关系。因此,可以从组合中获得的所有内容(包含,当类 A 具有类 B 作为其成员时)都可以通过私有继承获得,反之亦然。

所以下面的代码应该是一个Has-A关系,但在我看来,它不是!

谁能告诉我我失踪了?或者如何通过组合来实现这段代码?