问题标签 [deduction-guide]
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.
c++ - 类内定义的C++17演绎指南在类内无效,但在类外有用
我C++17
在一个名为Test
.
但是我发现包含模板参数的第一推导指南在类本身Ts
内部无效。Test
但在它之外有效,例如在main
功能上。
不包含模板参数的第二推导指南在课堂内外都有效。
谁能告诉我为什么?
我的 IDE 是Visual Studio 2019
,C++ 标准是C++17
.
谢谢你。
c++ - 如何编写聚合模板别名的推演指南?
使用 C++20,可以为别名模板生成扣除指南(请参阅https://en.cppreference.com/w/cpp/language/class_template_argument_deduction上的“别名模板的扣除”部分)。然而,我无法让它们使用聚合初始化语法。在这种情况下,似乎没有生成别名的扣除准则。
看这个例子:
我曾尝试编写演绎指南,但每次都会遇到编译器错误。
以及我能想到的任何其他指导方针。
甚至可以自动推导出数组别名的大小吗?
我正在使用 GCC 10.2
c++ - 尽管用户提供了扣除指南,但模板候选被忽略
我有一个sequence
类似于的结构std::integer_sequence
,但它可以保存多种类型的值作为非类型模板参数(有点像编译时元组)。它可以std::integer_sequence
通过使用constexpr
构造函数和用户定义的推导指南隐式构造。我还有一个apply_constexpr
将非类型模板参数包应用于函数的函数,类似于std::apply
. 他们来了:
它们可以这样使用:
当sequence
像上面那样明确构造时,一切都很好。但是,因为构造函数不是explicit
以下也有效:
但是尽管它有效,但以下内容不起作用(candidate template ignored: could not match 'sequence' against 'integer_sequence'
):
为什么它不起作用,我该怎么做才能使它起作用?
c++ - 类模板参数推论的任何替代推论?
我有一个类模板:
我尝试使用 c++17 功能Class template argument deduction (CTAD)
进行推断T
,但我不能这样做,因为无法推断N
和指定N
意味着无论如何都不会尝试 CTAD。所以我采用了老式的方式:
这允许我只提供N
和T
推断。是否有我忽略的 c++20(及更高版本)功能,可以让我省去这个功能?我试过这个:
但是,它不起作用,因为:
仅当不存在模板参数列表时才执行类模板参数推导。如果指定了模板参数列表,则不会进行推导。
c++ - 非类型模板参数的自定义推导指南
我有一个矩阵类的开始。这是代码-
到目前为止,这是该类的使用方式-
注意到冗余了吗?如果用户想要使用std::initializer_list
构造函数创建矩阵,那么他们必须首先在模板参数中指定宽度和高度。此外,如果他们使用std::initializer_list
的尺寸与模板参数中指定的尺寸不同,那么行为将是未定义的。非类型模板参数如何写推演指南?我知道如何使用基本模板来做到这一点,但是我尝试像您一样尝试做的所有事情通常都会产生许多编译器错误。这是期望的行为-
编辑:任何想要制作矩阵类的人都不应该制作宽度和高度模板参数。它只是不必要地使事情复杂化。
c++ - 演绎指南是否需要 noexcept 说明符?
由于某些原因,我一直认为演绎指南必须与noexcept
它们所引用的构造函数具有相同的特性。例如:
也就是说,如果构造函数是noexcept
并且我希望它也是 for const char &
,我也必须将说明noexcept
符添加到推导指南中。
今天我和ICC做了一点工作,发现它noexcept
在扣除指南上有问题。到目前为止,一切都很好。我认为这是编译器的错误,仅此而已。
但是,我查看了标准,找不到任何可以证实我最初假设的点。正因为如此,我对 clang 进行了同样的检查,即使它没有问题,似乎noexcept
在 100% 的情况下,扣除指南上的内容都会被忽略。另一方面,构造函数上的那个会影响两者。
所以,我的问题是,它是否有任何意义或者是否需要在某种程度上传播(如果这有道理的话)构造函数的-ness 也适用于演绎指南,或者它是无用的noexcept
,我可以摆脱所有noexcept
扣除指南?
c++ - 大括号初始值设定项列表推导指南
有一个非常类似于std::initializer_list
在标准 C++ 库不可用的环境中使用的实现:
然后这样initializer_list<T>
将在另一个类构造函数中使用:
以及同时使用这两种东西的意图:
显然,编译器不知道如何推断大括号初始值设定项列表的类型,以便它使用上面实现的 initializer_list。我想应该实现某种演绎指南来连接我的 initializer_list 和大括号初始化列表的实现。但我不知道如何实施。
有人可以建议我如何实施所描述的扣除指南吗?
c++ - 一个“constexpr”标记的变量和一个静态存储持续时间的变量是否可以通过带有推导指南的类类型进行存储?
考虑以下代码:
现在的问题是,无需显式声明模板参数即可成功通过a1
,但没有静态存储持续时间wrap
a2
。
如果我将上述扣除指南更改为:
如果可能的话,如何修改上面的代码,以便能够同时传递a1
和a2
分别传递,而不必显式声明像fun<wrap<decltype(a1)>{a1}>()
or之类的类型fun<wrap<const decltype(a2)&>{a2}>()
?
c++ - 带有一些用户提供的参数的模板推导
假设有一个类有两个模板参数
是否可以有一个推导指南,其中仅推断一个参数而另一个参数是用户指定的?
当我尝试这个时,clang给我“推导指南模板包含无法推导的模板参数”
c++ - clang vs gcc - 从模板参数派生的结构的 CTAD
考虑以下代码:
gcc 12.x 接受它并推断
d
为D</* type of lambda */>
预期的那样。clang 14.x 拒绝它并出现以下错误:
哪个编译器在这里表现正确?