如何将 std::unique_ptr 传递到函数中

2024-03-23

我怎样才能通过std::unique_ptr变成一个函数?假设我有以下课程:

class A
{
public:
    A(int val)
    {
        _val = val;
    }

    int GetVal() { return _val; }
private:
    int _val;
};

以下内容无法编译:

void MyFunc(unique_ptr<A> arg)
{
    cout << arg->GetVal() << endl;
}

int main(int argc, char* argv[])
{
    unique_ptr<A> ptr = unique_ptr<A>(new A(1234));
    MyFunc(ptr);

    return 0;
}

为什么我无法通过std::unique_ptr变成一个函数?这肯定是该构造的主要目的吗?或者 C++ 委员会是否打算让我退回到原始 C 风格指针并像这样传递它:

MyFunc(&(*ptr)); 

最奇怪的是,为什么这是一种好的传递方式?这看起来非常不一致:

MyFunc(unique_ptr<A>(new A(1234)));

这里基本上有两个选择:

通过引用传递智能指针

void MyFunc(unique_ptr<A> & arg)
{
    cout << arg->GetVal() << endl;
}

int main(int argc, char* argv[])
{
    unique_ptr<A> ptr = unique_ptr<A>(new A(1234));
    MyFunc(ptr);
}

将智能指针移动到函数参数中

请注意,在这种情况下,断言将成立!

void MyFunc(unique_ptr<A> arg)
{
    cout << arg->GetVal() << endl;
}

int main(int argc, char* argv[])
{
    unique_ptr<A> ptr = unique_ptr<A>(new A(1234));
    MyFunc(move(ptr));
    assert(ptr == nullptr)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 std::unique_ptr 传递到函数中 的相关文章

  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • asp.net 文本框文本模式数字,仅允许数字

    我只是想知道 ASP NET 中是否有一种方法只允许文本框中的数字textmode number 当我使用这个时
  • 以编程方式检查页面是否需要基于 web.config 设置进行身份验证

    我想知道是否有一种方法可以检查页面是否需要基于 web config 设置进行身份验证 基本上如果有这样的节点
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • 对齐 GridView 中的行值

    我需要在 asp net 3 5 中右对齐 gridview 列中的值 我怎样才能做到这一点
  • POCO HTTPSClientSession 发送请求时遇到问题 - 证书验证失败

    我正在尝试使用 POCO 库编写一个向服务器发出 HTTPS 请求的程序 出于测试目的 我正在连接到具有自签名证书的服务器 并且我希望允许客户端进行连接 为了允许这种情况发生 我尝试安装InvalidCertificateHandler这是
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 检查算术运算中的溢出情况[重复]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • 如何将“外部模板”与由同一类中的模板化成员使用的嵌套类一起使用?

    首先 一些背景信息 我尝试以 Herb Sutter 在他的解决方案中介绍的方式使用 Pimpl 习语 得到了 101 http herbsutter com gotw 101 这在头文件中看起来像这样 include pimpl h h
  • 即使手动设置显示环境变量后,WSL Ubuntu 也会显示“错误:无法打开显示”

    我在 WSL Ubuntu 上使用 g 我使用 git 克隆了 GLFW 存储库 使用了ccmake命令配置并生成二进制文件 然后使用make在 build 目录中最终创建 a文件 我安装了所有OpenGL相关的库 usr ld 我不记得我
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • Azure 事件中心 - 按顺序接收事件

    我使用下面的代码从 Azure Event Hub 接收事件 https learn microsoft com en us azure event hubs event hubs dotnet framework getstarted s
  • System.Runtime.InteropServices.COMException(0x80040154):[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 C 项目中遇到异常 System Runtime InteropServices COMException 0x80040154 检
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没

随机推荐

  • Ext JS:xtype 有什么用?

    我看到 Ext JS 中有很多例子 其中不是实际创建 Ext JS 对象 而是一个带有xtype属性被传入 这有什么用 如果无论如何都要创建对象 性能增益在哪里 如果这是原因 xtype是识别特定组件的简写方法 panel Ext Pane
  • 在这种特定情况下,使用成员初始值设定项列表和在构造函数中赋值之间有区别吗?

    在内部和生成的代码方面 以下之间是否存在真正的区别 MyClass MyClass capacity 15 data NULL len 0 and MyClass MyClass capacity 15 data NULL len 0 谢谢
  • 进程的页表是否映射到内核地址空间?

    我当时正在做 Windows 系统编程 想知道是否可以在源代码级别访问进程的页表 这是我所了解的与虚拟内存相关的页表 假设用户刚刚在 Windows 操作系统 32 位 上运行一个名为 A 进程的进程 首先 操作系统为A进程创建并维护4GB
  • ER 图中的 mysql 工作台列图标意味着什么?

    谁能帮我解释一下 MySQL Workbench 中创建的数据库 ER 图中的图标 蓝钻 实心 蓝钻 未填充 红钻等 Thanks 我在 MySQL 的网站上找到了这些资源 http dev mysql com doc workbench
  • 一个数组占用多少空间?

    如果我创建 10 个整数和一个 10 的整数数组 占用的总空间会有什么差异吗 我必须创建一个包含数百万条记录的布尔数组 所以我想了解数组本身将占用多少空间 整数数组表示为保存整数的内存块和对象头 对于 32 位 JVM 对象标头通常需要 3
  • 有修订的三重存储

    我需要存储 RDF 三元组 同时跟踪修改 有这项服务吗 或者 在使用上下文感知三重存储时如何跟踪修订 Edit 请注意 我不仅仅需要变更集 我还需要查看过去任何时间的三元组 我试图通过存储额外的三元组来解决这类问题 这些三元组描述了谁在何时
  • 为什么不能在函数中声明模板?

    Reading C 模板 完整指南 http www amazon co uk Templates Complete Guide David Vandevoorde dp 0201734842它说 请注意 模板不能被声明 在一个函数中 它不
  • Leanback 库支持 API 级别 19 Android for TV 应用程序吗?

    是否有针对 Android API 级别 19 的 Leanback 库支持 在这个链接中https developer android com reference android support v17 leanback package
  • 从 AudioBuffer 在 Node.js 中写入 wav 文件

    我是 Node js 编程新手 我正在尝试将 m4a 文件转换为 wav 文件 我使用了 audiobuffer to wav 和 web audio api 这是我的代码 const fs require fs const toWav r
  • Java接口和继承

    如果我们有 public interface Foo public class Bar implements Foo 之间有区别吗 public class BarBar extends Bar implements Foo and pub
  • 如何使用 AVFoundation 将视频转换为动画 gif?

    在使用 AVFoundation 和 AVCamRecorder 录制电影后 我正在推送一个新的 UIViewController 目前 我正在从保存电影的 URL 播放电影 效果很好 我在理解如何将视频从 URL 转换为动画 gif 时遇
  • 抑制已经遇到的列表元素

    您好 我有一个正在尝试编辑的速度模板 它目前有一个看起来像的块 foreach element in myList element field1 element field2 issued by element field element
  • 为什么bark方法无法调用

    class Animal void run class Dog extends Animal void bark class Testing public static void main String args Animal d new
  • Eclipse - 为现有项目设置 .classpath 文件

    我有一个java项目 来自其他人的 Eclipse 项目的工作文件夹 我认为这是一个 Repast Simphony 项目 在我的 Eclipse 中 我创建了一个新的 Java 项目并告诉它使用现有的代码 所以它似乎已经引入了所有代码 但
  • 将每周事件添加到日历

    我想向本地添加一个事件Calendar 在这里我想在每个Tuesday until 31 December 2015 btnWeekly setOnClickListener new OnClickListener Override pub
  • 如何使用 devtools install_github 从私人仓库安装 R 包?

    我正在尝试从我的 github 存储库安装示例包 https github com jpmarindiaz samplepkg 当存储库公开时 我可以通过 R 解释器使用以下任何命令来安装它 install github jpmarindi
  • 使用 Flexbox 将元素与底部对齐

    我有一个div和一些孩子 div class content h1 heading 1 h1 h2 heading 2 h2 p Some more or less text p a href class button Click me a
  • 如何向 ActiveRecord 添加新属性

    从模型中获取所有值后 我想向 ActiveRecord 类添加另一个自定义属性 该属性不是数据库中的列 以便我可以在视图中使用它 但 Rails 不允许我添加一个 我应该在其模型类中添加什么 test all test each do el
  • 尝试将 Firebase 添加到我的 Android 项目时,我遇到了 gradle 同步错误 JAVA_LETTER_OR_DIGIT

    当我按照 firebase 指南添加依赖项并同步项目时 出现错误 JAVA LETTER OR DIGIT 我使用 MAC OS X Yosemite 我的 android studio 版本是 3 1 4 我的应用程序成绩文件 apply
  • 如何将 std::unique_ptr 传递到函数中

    我怎样才能通过std unique ptr变成一个函数 假设我有以下课程 class A public A int val val val int GetVal return val private int val 以下内容无法编译 voi