问题标签 [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 回答
1040 浏览

c++ - 如何让“工厂函数”返回不可复制的对象?

语境

尝试在内部创建一些具有不同文件名的 gzip 存档,我编写了以下代码片段。

问题

这(如我们所料)会产生核心转储,因为makeGZipStream我们尝试通过(右值)引用返回本地堆栈分配的变量。但是在这种情况下,副本不是一个选项,因为boost::iostreams::filtering_ostream它是不可复制的。

问题

  1. 由于它的移动构造函数,我们可以返回一个std::unique_ptr“按值”(由于复制省略,移动甚至不应该在 C++17 中发生),为什么在这种情况下不可能呢?
  2. 那里有什么好的解决方案?

可能的解决方案

  1. 将所有内容放在同一范围内(我试图避免的)
  2. 将您的对象包装在一个unique_ptr(不太漂亮)中
  3. 还要别的吗 ?

笔记

使用的编译器是相当旧的g++ (GCC) 4.9.3.

0 投票
1 回答
62 浏览

c++11 - 不可复制对象的新放置

我试图模拟一个vector独特的指针,只是为了了解放置 new 如何处理无法复制的对象。

该行new (royals + size) T(item)是编译错误,因为无法复制唯一指针。

我们必须移动唯一指针,而不是复制。不幸的是,在这种情况下,它们无法移动,因为它们存在于初始化列表中。

这个问题有解决方法吗?

0 投票
3 回答
662 浏览

c++ - 可以将容器的复制构造函数定义为不可复制值类型的删除吗?

如果我们有一个具有不可复制值类型的容器,这样的容器类仍然定义了复制构造函数,只是它可能不会被调用。

这可能会导致“隐藏”问题,例如此处讨论的问题:Visual Studio 2017 是否需要显式移动构造函数声明?.

我的问题是标准库实现是否可以将此类复制构造函数定义为有条件地删除,即在不可复制值类型的情况下删除。这对我来说很有意义(至少在有 C++ 概念之前)。这样的实现会符合标准吗?

0 投票
3 回答
682 浏览

c++ - 在统一的内联初始化中使用不可复制的值初始化静态 std::map

我想初始化一个std::map值不可复制的静态变量。我会打电话给我的班级ValueClassValueClass有一个std::unique_ptr私有成员,我什至通过扩展来确保 ValueClass 不可复制,non_copyable如下所示:

现在我正在尝试使用我的类作为值来定义一个 std::map :

initializer_list尝试复制此类时出现编译错误。

这个周末我试图make_map在很多小时内编写自己的整个函数以启用初始化而不复制,但我失败了。我已经尝试过这个那个其他,但没有一个可以用 Visual Studio 15.9.4 编译。

如何使用 Visual Studio 编译器在不强制复制的情况下初始化静态 std::map 并在一个函数中统一初始化?

编辑: 这是我试图让它工作的现实生活场景的简化版本(请原谅我缺乏命名约定和案例不一致):

重复编辑:该问题中提供的解决方案不适用于我拥有的类结构。我也在寻找修复make_map_by_moving函数的解决方案,换句话说就是内联初始化,提供的答案是函数调用的命令式解决方案。

0 投票
1 回答
45 浏览

c++ - Non-Copyable 类是否应该有用户转换

我的问题是,不可复制的对象是否应该具有隐式/显式用户转换?至少从我下面的示例来看,转换看起来非常像副本。

PS:我知道这里推荐“避免隐式转换运算符” https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c164-avoid-implicit-conversion-operators

为了解释我的基本原理,假设我有一个使用 RAII 管理 OS 对象的类。没有什么花哨。

这没关系。它允许我做类似的事情:

问题是其他操作系统功能不会接受我的对象。所以我尝试了总是危险的隐式/显式用户转换路径。

这使我可以正常使用我的对象。

这太棒了!但是现在的问题是我允许泄漏关闭的句柄的可能性。假设我直接将我的对象分配给一个 HANDLE 对象,而不是左值,这不仅泄漏了非托管 HANDLE,甚至泄漏了一个封闭的 HANDLE。例如:

我了解问题 1 发生了以下情况:

1 - 我从操作系统获得了 HANDLE 并将它传递给我的对象来管理它;
2 - 我使用隐式用户转换运算符返回了 HANDLE;
3 - 编译器调用我的对象析构函数来关闭句柄;
4 - 一个封闭的 HANDLE 以不明显的方式泄漏。可能的运行时错误。因为 HANDLE 不是 INVALID_HANDLE_VALUE,所以即使是错误检查也无法捕捉到这一点。

当然,我也启用了这个案例。但为了争论,让我们说我接受这个案子。

因为如果不是选择隐式/显式用户转换,而是选择一元运算符,我可以避免临时对象的转换,例如:

这给了我一个编译错误,例如:

这是理想的,但据我所知,我们不能对转换做同样的事情。

我想象的其他解决方案是以下功能:

所以回到我的问题,这种情况可以避免吗?或者不可复制的对象不应该有用户转换?老实说,它们与返回一些托管私有对象的简单 get() 有何不同?也许是一种避免用户从临时对象转换的方法?我们可以强制一个对象在任何其他用途之前被左值化,无论是方法调用还是转换?

0 投票
1 回答
196 浏览

c++ - 构建一个使用 boost 的 .cu 文件

我运行了以下命令:

并得到以下编译错误:

谷歌搜索把我带到了这里

直到这家伙使用了一种变通方法,所有的希望似乎都落空了。虽然,作为初级程序员,我不明白他的意思

使用g ++ 11 open从源代码构建提升解决了这个问题

这是否意味着从头开始重建提升?它与默认构建 boost 有何不同?

那么在同一个项目中同时使用和 CUDA 的实际解决方法是什么?

0 投票
0 回答
42 浏览

c++ - 将 boost mapped_matrix 与 std::unique_ptr 一起使用有什么限制?

将 boost 的 mapped_matrix 与 std::unique_ptr 等不可复制对象一起使用是否有任何限制?我在 C++14 模式下使用 VS2017。

所以这对我来说看起来很有用!我的问题是:

  • mapped_matrix 真的无法处理不可复制的对象吗?
  • 这是故意的(由于架构问题),还是我应该就此提交错误报告?
  • 但是,如果它可以与不可复制的东西一起使用,如何正确使用它?
  • mapped_matrix 的文档很漂亮,嗯,很差。有人有另一个链接提供更多信息吗?喜欢
    • functor和ref()的使用场景是什么?ref() 保证矩阵中的对象存在(如果它是默认构造的对象)是否正确?
    • 仿函数返回的类型“reference”和insert_element()返回的“true_refrence”有什么区别?听起来实施在这里流血?
    • 方法assign_temporary()的使用场景是什么?

我的解决方法当然是使用 std::shared_ptr,在那里编译没有问题......

0 投票
1 回答
403 浏览

c++ - std::optional 不可复制?

假设我有类似于这个伪代码的东西:

这是行不通的,基本上如果尝试使用真实代码会给出关于返回类型无法转换为的错误std::optional

解决这个难题的最佳方法是什么?

0 投票
1 回答
58 浏览

c++ - 不可复制基类的聚合初始化

我正在从不可复制的基类构造派生类。我想在初始化程序Base中聚合初始化:

但我得到:

据我了解,noncopyable无法初始化,足够公平。然后我可以以某种方式制作聚合初始化程序以便跳过不可复制的初始化吗?(我尝试了例如Base{{},a}没有真正理解的事情,但这也不起作用:~noncopyable受保护)。

或者我是否需要明确定义Base::Base哪个会跳过noncopyable初始化,使用它Derived::Derived而不是聚合初始化?

0 投票
2 回答
69 浏览

c++ - 如何确定捕获不可复制参数的 lambda 类型?

鉴于以下不可复制的任务类和示例代码

如果我用auto类型而不是std::function声明测试变量,则程序编译并运行完美,否则它将拒绝编译并出现此错误:

我真的需要声明测试的类型,因为它最终将成为另一个类的成员。

我怎么做 ?

我是否正确假设 std::function 应该以某种方式声明为 mutable ?