C++ 到 chrono::duration 的转换运算符 - 适用于 c++17,但不适用于 C++14 或更低版本

2024-01-05

以下代码使用带有 C++17 集的 gcc 7.1.0 进行编译,但不使用 C++14 集(或 Visual Studio 2017)进行编译。很容易重现Wandbox https://wandbox.org/permlink/b8QJGuSPUcTPRuFM.

必须做什么才能使其与 C++11/14 一起工作?

#include <iostream>
#include <chrono>

int main()
{
    struct Convert
    {
        operator std::chrono::milliseconds()
        {
            std::cout << "operator std::chrono::milliseconds" << std::endl;
            return std::chrono::milliseconds(10);
        }

        operator int64_t ()
        {
            std::cout << "operator int64_t" << std::endl;
            return 5;
        }
    };

    Convert convert;

    std::chrono::milliseconds m(convert);
    std::cout << m.count() << std::endl;
    int64_t i(convert);
    std::cout << i << std::endl;
}

让我们首先了解为什么这在 C++14 中不起作用。有两个相关的 c'torsstd::chrono::duration http://en.cppreference.com/w/cpp/chrono/duration/duration (which std::chrono::milliseconds别名为):

duration( const duration& ) = default;

template< class Rep2 >
constexpr explicit duration( const Rep2& r );

模板化的参数更适合类型参数Convert。但它只会参与重载决策,如果Rep2 (a.k.a Convert) 可以隐式转换为以下表示类型std::chrono::duration. For milliseconds, 那是long在Wandbox上。你的int64_t转换运算符使隐式转换成为可能。

但这是问题所在。对此隐式转换的检查不考虑转换成员函数的 cv 限定符。因此选择了重载,但它接受 const 引用。并且您的用户定义的转换运算符不是const合格的!@Galik https://stackoverflow.com/users/3807729/galik在您帖子的评论中指出了这一点。因此,转换在 c'tor 内失败milliseconds.

那么如何解决呢?两种方式:

  1. 标记转换运算符const。然而,这将选择转换为int64_t对彼此而言m and i.

  2. 将转换标记为int64_t as explicit。现在,模板化重载将不会参与重载决策m.

最后,为什么这在 C++17 中有效?这将保证复制省略。自从你的Convert有一个转换为std::chrono::milliseconds,它用于初始化m直接地。它的细节涉及甚至不需要选择复制构造函数,只需稍后将其删除即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 到 chrono::duration 的转换运算符 - 适用于 c++17,但不适用于 C++14 或更低版本 的相关文章

随机推荐

  • 为什么 Scala 案例类字段不反映为公共字段?

    我一直将案例类的构造函数参数理解为定义公共值 但是 当我反映这些字段时 isPublic 方法出现错误 有什么想法吗 scala gt class Test val name String val num Int defined class
  • 自定义 Ansible 回调未接收 group_vars/host_vars

    我正在编写一个自定义的 ansible 回调 class CallbackModule CallbackBase CALLBACK VERSION 2 0 CALLBACK TYPE aggregate CALLBACK NAME my c
  • 如何在mayavi(imshow)中绘制彩色图像

    是否可以使用mayavi绘制具有3个颜色通道的图像 根据 mayavi 的文档 mayavi mlab imshow只能处理形状为 n x m 的图像 Method 我必须使用 Mayavi 的自定义色彩图 请参阅http docs ent
  • 用于网站和 Api 的 Ninject - 序列不包含元素

    我有一个带有 Web Api 项目和 MVC 3 项目的 VS2010 解决方案 Web APi 和 MVC 项目都有自己的 App Start 和 NinjectWebCommon 并在其中声明了自己的绑定 当尝试使用 Api 时 我总是
  • PHP 中的 OOP:来自变量的类函数?

    是否可以像这样从类中调用函数 class new class function name do the thing req class gt function name 类似的解决方案 这似乎不起作用 是的 这是可能的 这就是众所周知的变量
  • 在单个 ASP.NET Core WebAPI 服务中托管多个产品 API

    我正在设计一个基于 ASP NET Core 的 Web API 它需要支持我的产品的多个变体 比方说基于许可证或安装的品种 我没有为每种类型的产品提供多种服务 而是考虑使用一个服务来容纳 托管多个端点或 URL 我将在安装时在 appse
  • 如何在c中读取图像的像素?

    假设我们的位图图像具有高度 M 和宽度 N 我们总是假设 在本实验中 宽度 N 是 4 的倍数 这简化了 文件中的字节布局 对于该图像 像素数组存储 正好 3 x N x M 字节 如下所示 每组 3 个字节代表一个像素 其中字节存储 按顺
  • 如何在 main 中设置 Nimbus 外观

    我刚刚学习Java 仍然无法解决我遇到的这个小问题 我的弹出日历使用 Nimbus 外观和感觉 但我有使用 Java 外观和感觉的面板和容器 Jtable 我试图使每个 GUI 屏幕 窗口都使用 Nimbus 外观和感觉 Merky 建议将
  • 从 numpy 数组到 DICOM

    我的代码读取 DICOM 文件 将像素信息放入 numpy 数组 然后修改 numpy 数组 它使用列表是因为我试图同时操作多个 DICOM 文件 我还没有找到任何关于如何获取修改后的 numpy 数组并再次使其成为 DICOM 文件的信息
  • 通过 Windows API 检索 PCI 坐标(用户模式)

    有没有办法使用 Windows c c API 例如 PnP Configuration Manager API 获取设备的 PCI 坐标 总线 插槽 功能号 我已经知道如何在内核模式下执行此操作 我需要一个用户模式解决方案 我的目标系统是
  • 在“for”循环中递增 1 时格式化背后的技术原因?

    整个网络上都有代码示例for循环看起来像这样 for int i 0 i lt 5 i 当我使用以下格式时 for int i 0 i 5 i 我这样做是因为我相信这样会更有效率 但是在大多数情况下这真的很重要吗 每个人都喜欢他们的微观优化
  • 使用来自 json 文件的字符串将字符串数组传递给 React 组件,并允许内联 span 标签

    我正在尝试获取一个字符串数组来显示为段落 并允许在这些字符串内使用内联跨度标签 我的问题是 当在段落内添加值时 会将 标记的开头和结尾解码为其解码值 有没有一种简单的方法可以使其工作而无需为此情况制作特定组件 我的React组件如下 con
  • 从 Flask 运行 Scrapy

    我有这个文件夹结构 app py flask app app datafoo scrapy cfg crawler py blogs pipelines py settings py middlewares py items py spid
  • boto3 s3 对象过期“MalformedXML”错误

    我尝试使用以下命令设置 Amazon S3 存储桶中子目录的生命周期配置boto3 put bucket lifecycle configuration 我使用了这段代码AWS 文档 https docs aws amazon com co
  • 在图形之间移动或复制补丁

    如何在图形之间移动 或复制 补丁matplotlib 我正在处理一组腌制的人物 并想将它们合并到一个情节中 使用线图时这没有问题 因为我可以通过以下方式访问数据ax get lines 然而 在使用直方图时 ax get lines回报 a
  • 在主页小部件中使用 ScrollView 时出现问题

    我能够在应用程序的布局 xml 文件中成功使用 ScrollView 但是 当我尝试在小部件的布局 xml 文件中使用 ScrollView 时 一旦将小部件放入模拟器中 就会收到 加载小部件时出现问题 错误 如果我注释掉 ScrollVi
  • 是否可以禁用在页面中查找的 Ctrl + F 功能?

    我有一个拼图网站 这是一种可怕的作弊方式 只做一部分也可以 但是能做到吗 我的想法是用图像替换字母 但还有比这更简单的吗 Code window addEventListener keydown function e if e keyCod
  • 按 ID 划分的行频率

    数据集包含三个变量 id 性别和年级 因素 mydata lt data frame id c 1 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 4 sex c 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1
  • 将信息从一个 jframe 传递到另一个 jframe

    首先 我知道使用多个 jframe 是不受欢迎的 不幸的是我已经深入到这个项目中来重新开始 我的问题是我找不到一种方法将数据 用户输入 从一个帧传输到另一个帧 我将提供需要从帧 1 传输到另一个帧的代码 这是我的代码 用于他们必须输入的姓名
  • C++ 到 chrono::duration 的转换运算符 - 适用于 c++17,但不适用于 C++14 或更低版本

    以下代码使用带有 C 17 集的 gcc 7 1 0 进行编译 但不使用 C 14 集 或 Visual Studio 2017 进行编译 很容易重现Wandbox https wandbox org permlink b8QJGuSPUc