在隐式参数转换中使用演绎指南

Use deductions guides in implicit argument conversion

考虑以下模拟类型定义:

template<typename T> struct Foo {};

template<typename T, size_t offset>
struct FooView {
    FooView(const Foo<T>&) {}
};
template<typename T> FooView(const Foo<T>&) -> FooView<T, 0>;

template<typename T, size_t s>
void yada(FooView<T, s> arg) {}

正如你所看到的,我们有一个类型 Foo,这里代表事物的集合 T 和一个类型 FooView 代表 Foo 的视图,以及一些偏移量 s (偏移量的性质并不那么重要)。它还提供了推导指南,从 FooFooViewoffset = 0

现在,考虑一下它是如何使用的:

Foo<float> foo;
// yada(foo); // <-- error: no matching function for call to 'yada'
yada(FooView{foo});

我本以为隐式构造函数与演绎指南配对就足以使注释调用起作用,但实际上我必须键入转换。我能以某种方式使它隐式转换吗?

我试过在 Foo 中引入隐式转换运算符,如下所示:

operator FooView<T, 0>() { return FooView{*this}; }

但无济于事。编译器仍然抛出相同的错误。

Class 模板参数推导仅适用于 certain situations,它们都需要使用实际的 class 模板占位符。 arg 不会触发扣除,只有 cls(arg) 会触发。

yada(foo) 只是遵循重载解析的正常规则,并且由于 foo 不是 FooView(模板推导不考虑转换),重载解析失败。

yada(FooView(foo)) 执行 class 模板参数推导 因为你要求它 。这始终是一个明确的 on-demand 功能。