C++20 中的 CTAD 和指定初始值设定项

2024-02-25

我已经在本文中表达了对 CTAD 与指定初始化程序的混淆question https://stackoverflow.com/questions/57886451/c20-designated-initializers-with-templated-types,但我对非常相似的代码片段有另一个困惑

template <typename int_t=int, typename float_t=float>
struct my_pair {
    int_t   first;
    float_t second;
};

template<typename ... ts>
my_pair(ts...) -> my_pair<ts...>;

int main() {
    my_pair x{.second = 20.f};
    static_assert( std::is_same_v<decltype(x.first), int> ); //FAILS <- its deduced to float
    static_assert( std::is_same_v<decltype(x.second), float> );
}

看来推演指南导致的类型first可以推论为float,尽管我没有明确给出.first在指定的初始值设定项中。推导指南显然只关心初始化器中的顺序,无论关键字 (.second)。扣税指南应该聪明一点还是应该有一个“指定扣税指南”?

请参阅示例https://godbolt.org/z/cm6Yi7 https://godbolt.org/z/cm6Yi7


See 这个答案 https://stackoverflow.com/q/57886451/2069064作为起点。我们有相同的最初三个候选人:

template <class T=int, class U=float>
struct my_pair {
    T first;
    U second;
};

// default constructor
template <class T=int, class U=float>
auto __f() -> my_pair<T, U>;

// copy candidate
template <class T=int, class U=float>
auto __f(my_pair<T, U>) -> my_pair<T, U>;

// deduction guide
template <class... T>
auto __f(T...) -> my_pair<T...>;

且合计扣除候选者以实际情况为准初始化列表 or 指定初始化列表我们提供的不是聚合的实际底层成员。我们的指定初始化列表 is {.second = 20.f}所以我们的总扣除候选人变成:

// aggregate deduction candidate
template <class T=int, class U=float>
auto __f(U) -> my_pair<T, U>;

模板参数始终来自主类模板,因此我们从那里引入默认模板参数。候选人的论点来自于初始化列表,以及类型second is U.

聚合推导候选是最佳候选(只有聚合推导候选和推导指南可行,聚合推导候选更专业),所以我们最终得到my_pair<int, float>.


完成 CTAD 后,我们现在重新开始并有效地做

my_pair<int, float> x{.second = 20.f};

这有效并导致x.first正在初始化自{}.


CTAD 总量最近才被采用(两个月前,2019 年 7 月的科隆会议上)。在该功能出现之前,这仍然是格式良好的:

my_pair{.second = 20.f};

为什么?我们还没有总计扣除候选人,但我们仍然有扣除指南......其中is可行的。它给我们my_pair<float>。也就是说,my_pair<float, float>一旦您填写了默认模板参数U.

这就是为什么 gcc 给你你所看到的行为 - 它只是还没有为聚合实现 CTAD,并且给你旧的行为。

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

C++20 中的 CTAD 和指定初始值设定项 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 没有特殊字符的密码验证器

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

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 重载 (c)begin/(c)end

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

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 如何获取可用 NSFont 系列的列表?

    如何获取可用 NSFont 系列的列表 最好使用 fontName 等效项 NSLog NSFontManager sharedFontManager availableFontFamilies description Gives Abad
  • r dplyr group_by 值折叠并粘贴

    我有一个看起来像这样的数据集 Id Subject Date Vitals Value 10 John 2001 05 29 HeartRate 65 10 John 2001 05 29 HeartRate 68 10 John 2001
  • 在 python 中按第一(或第二,或其他)列对文件进行排序

    这似乎是一个非常基本的问题 但我是Python新手 在花了很长时间尝试自己寻找解决方案之后 我认为是时候询问一些更高级的人了 所以 我有一个文件 样本 ENSMUSG00000098737 95734911 95734973 3 miRNA
  • 当FormArray嵌套在另一个FormArray中时如何获取FormArrayName?

    参考 https angular io docs ts latest api forms index FormArrayName directive html https angular io docs ts latest api form
  • Python:从 Ipywidget 按钮重置 Matplotlib

    在 Jupyter 笔记本中使用 iPyWidgets 和 Matplotlib 时 即使有多个子图以及带有多个滑块的多个变量 也很容易获得实时更新的图形 只需设置一个interact包含激活的绘图函数以及两个滑块变量的构造函数 pylab
  • 如何获取符号链接的绝对路径?

    如何获取符号链接的绝对路径 如果我按照以下方式进行 char buf 100 realpath symlink buf 我不会获得符号链接的绝对路径 但我会获得此符号链接链接到的绝对路径 现在我的问题是 如果我想获取符号链接本身的绝对路径怎
  • 连接两列中具有相同值的两行

    这是我的桌子的打印屏幕图像 我有一个名为 table 的 MySQL 表 当我写下 SELECT FROM table 在 while 循环中 我想获得一次相同的 fikraNo 和 maddeNo 值 但是如果 fikraNo 和 mad
  • 使用 ODBC 连接 SQLite,无需注册数据库

    是否可以在 C 中连接到 SQLite 并使用 ODBC API 而无需在 ODBC 中注册数据库 我有使用 ODBC 与数据库通信的代码 但不想使用 SQLite 进行重写 也不想注册新的 ODBC 连接 您应该能够在不更改任何代码的情况
  • firebase中的数据排序

    我正在存储一个score对于我在 firebase 中的应用程序的每个用户 user name score 我想显示一个排行榜 其中包含前 10 位用户的姓名和分数 并保持实时更新 实现这一目标的最佳方法是什么 查看排行榜示例以了解执行此操
  • 如何获取所有Windows组?

    我写这个是为了获取特定用户所属的组 DirectoryEntry AD new DirectoryEntry WinNT Environment MachineName computer DirectoryEntry user AD Chi
  • 用户控件回发在更新面板中不起作用

    我有一个带有更新面板的母版页
  • 到同一个 Razor 页面的多个路由

    背景 我的 Asp Net Core 3 1 网站中有一个名为 SignupAndApply 的剃刀页面 它实际上是注册身份页面的复制和粘贴 但是 有一些附加字段 允许可选的 applyid 作为路由的一部分传递 如果我传递 applyId
  • 如何将 Angular CLI 升级到最新版本

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Using ng version I got 角度 cli 1 0 0 这不是可用的最新
  • 改进您的构建过程

    或者 当一开始就没有太多的构建流程时 实际上建立了一个构建流程 目前 这几乎就是我的团队面临的情况 我们主要进行网络应用程序开发 但目前不进行桌面开发 即使对于我们普通的应用程序 软件部署也是丑陋且笨拙的 而且在我加入这个团队 和公司 的两
  • 是否可以在我的网络应用程序中使用 Google Talk 的音频聊天服务?

    我正在用 PHP 构建一个应用程序 我想知道是否可以在我的 Web 应用程序中使用 Google Talk 的音频聊天服务 是的你可以 Google 将 Google talk 定义为 开放式 IM 服务 以便您可以将自己的客户端应用程序连
  • 在同一端口上运行 Angular 和 ASP.NET Web API

    我目前正在使用 Angular 向运行 ASP NET 的 API 服务器发出 API 调用 但是 对于角度开发 我有一个跨域问题 我使用的是 localhost 在生产版本中 它们都将使用 IIS 在同一域下运行 有没有办法在 ASP N
  • 如何根据某些条件更改 jinja2 条目的颜色? (使用烧瓶)

    我刚刚完成了烧瓶教程 http flask pocoo org docs 0 12 tutorial 逐步创建博客 Web 应用程序 这些条目通过 jinja 模板呈现 ul class entries for entry in entri
  • 在NearProtocol中,如何迁移合约状态

    假设有一个用near sdk rs编写的合约 已部署 其状态定义为 near bindgen derive BorshDeserialize BorshSerialize pub struct NFT pub tokens Unordere
  • 获取找不到符号:来自 ant 的 getSystemService 方法

    我刚刚开始使用 android ant 给了我以下错误 compile java 44 cannot find symbol javac symbol method getSystemService java lang String jav
  • C++20 中的 CTAD 和指定初始值设定项

    我已经在本文中表达了对 CTAD 与指定初始化程序的混淆question https stackoverflow com questions 57886451 c20 designated initializers with templat