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 或更低版本 的相关文章

  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile

随机推荐

  • 为什么 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