问题标签 [ctad]

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 回答
139 浏览

c++ - 嵌套模板类型的用户定义演绎指南

Q1:命名空间范围内是否允许用户定义的推导指南?

在此处的示例中,GCC 和 Clang 不会产生相同的行为:

简而言之,我们有一个模板参数类型,嵌套类型本身就是模板参数,模板参数之间没有任何关系。

标准规定:http ://eel.is/c++draft/temp.deduct.guide#3

[...]演绎指南应在与相应类模板相同的范围内声明,并且对于成员类模板,具有相同的访问权限。[...]

Q2:如果Q1没有,当namespace-type和nested-type template-parameters之间没有关系时,创建嵌套类型的自定义推导指南的语法是什么?

我希望语法接近:

然而,这nested<U>错误的,因为它需要一个推导的类型......来推导它。

此外,这被解释为具有尾随返回类型的函数void

谢谢你的时间。

0 投票
1 回答
72 浏览

c++ - 如何编写联合类型的扣除指南

假设我们有这个模板用于一个结构和一个相同大小的字节数组的联合

我们想在 C++17 之后的客户端代码中使用 CTAD 和聚合初始化

编译器希望我们有一个类型的推导指南point。在联合类型的情况下如何定义?

0 投票
1 回答
124 浏览

c++ - 具有推导的类模板特化类型的变量的声明器中的冗余括号

以下程序

由 GCC 编译,只有关于声明符周围多余括号的警告。但是,Clang 为声明给出了一个硬错误

错误:使用推导的类模板特化类型声明变量时不能使用括号

这是一个非常具体的错误(例如S<int> (s);编译),所以我想这是故意的,但我找不到说这是格式错误的措辞。像dcl.dcltemp.class.general这样的明显候选人不会对此说任何话,除非我错过了。

这是 GCC 错误,还是 IFNDR,Clang 有帮助?

0 投票
1 回答
46 浏览

c++ - c ++通过构造函数选择推断bool类模板参数

我试图通过选择类构造函数来推断一个 bool 模板参数。一个简单的例子:

这甚至可能还是必须在构造函数上明确指定 Condition ?
PS:条件不依赖A。

0 投票
0 回答
31 浏览

c++ - 模板化函数的 CTAD

我正在编写一个日志类,它使用源位置作为默认参数。

我想要一个类似 printf 的函数调用,我希望它应该可以使用 CTAD,但在这种情况下,它是用于模板化函数而不是模板化类,因此显然vlog不是类型(它是函数),因此错误。

不太确定我哪里出错了或者这是否真的可能?

log采用基本的字符串视图并且工作正常。

vlog是采用 printf 样式参数列表的“聪明”位,即const char*不同类型的可变参数。我试图包含尽可能多的代码,以防有更好的方法来做到这一点!

C ++ 17 并提前致谢。

螺栓链接

任何感兴趣的人的上下文;它适用于多线程和多核嵌入式系统(ESP32),主要需要防止不同的线程日志消息交错。

0 投票
2 回答
171 浏览

c++ - SFINAE 检测 CTAD 扣除指南的明确性

C++17 中 CTAD(类模板参数推导)鲜为人知的特性:您可以将用户定义的推导指南标记为explicit. (神箭。

A因此,类模板B具有明显不同的行为。我想编写一个单元测试,static_assert我的一个模板的行为类似于B,而不是A

这在 C++17 和/或 C++20 和/或“C++future”中是否可行?

0 投票
0 回答
88 浏览

c++ - CTAD(?) 函数模板的函数参数

为什么这段代码不起作用:

但是这个呢?

在这两种情况下,我们都在处理 ts 模板,但在第一种情况下,它是作为函数参数的嵌入式模板实例化,而在第二种情况下,模板是直接推导出来的。请详细说明使用 C++20 标准的参数。

0 投票
0 回答
26 浏览

c++ - 为什么 CTAD 不适用于结构内的模板化数据成员

我有一个用于学习目的的类pair_wrapper模板:std::pair

其中:

或者强迫我这样做:

或者使用自定义推导指南创建自定义构造函数:

去做:

我的问题是:为什么我不能直接推断出数据成员的模板参数,例如pair_wrapper{{1, 2.0}}该类型pair_wrapper是否被视为聚合

0 投票
2 回答
685 浏览

c++ - 为什么 ctor 中的 std::initializer_list 没有按预期运行?

在线演示

然而,根据 Scott Meyers 的Effective Modern C++(强调原文):

但是,如果一个或多个构造函数声明一个类型为 的参数 std::initializer_list,则使用大括号初始化语法的调用强烈倾向于采用 的重载std::initializer_lists强烈。如果编译器有任何方法可以将使用大括号初始化程序的调用解释为采用 a 的构造函数std::initializer_list,编译器将采用该解释。

所以,我认为std::vector{std::vector<int>{}};应该产生一个对象std::vector<std::vector<int>>而不是std::vector<int>.

谁错了?为什么?

0 投票
2 回答
116 浏览

c++ - 如何为带有推导指南的 C++ 类模板提供两个兼容的名称?

如果我有一个广泛使用的类模板Foo,我想重命名它Bar而不必自动更新其所有用户,那么在 C++17 之前我可以简单地使用类型别名:

在大型分布式代码库中工作时,这非常有用。然而,从 C++17 开始,这似乎被类模板参数推导指南所打破。例如,如果此行存在:

那么重命名类时最明显的事情就是将Foo演绎指南中的 s 更改为Bars:

但是现在在Foo(17)以前合法的随机调用者中的表达式是错误的:

是否有任何简单而通用的方法可以以完全兼容的方式为具有演绎指导的课程提供两个同时名称?我能想到的最好的方法是使用转换运算符在两个名称下定义类的公共 API 两次,但这远非简单和通用。