别名的模板别名的类模板参数推导 (C++20)

CJC*_*ink 2 c++ templates boost c++20

我正在使用boost::outcome_v2::result错误的自定义类型和该类型的别名。

现在我正在努力让类模板参数推导适用于我的别名。

代码:

class my_error{ ... };

template <typename result_t>
using my_result = boost::outcome_v2::result<result_t, my_error>;
Run Code Online (Sandbox Code Playgroud)

问题是,当我从函数返回此类型时,我无法对结果类型使用类模板参数推导:

const my_result res = some_function();
Run Code Online (Sandbox Code Playgroud)

但如果我直接使用它就有效boost::outcome_v2::result

const boost::outcome_v2::result res = some_function();
Run Code Online (Sandbox Code Playgroud)

有没有办法为我的别名编写推导指南,以便它也能正常工作?

编译器资源管理器链接

dfr*_*fri 6

有没有办法为我的别名编写推导指南,以便它也能正常工作?

不可以,由于别名模板只是类型的别名,因此在设计上不允许专门为别名模板编写显式推导指南。

相反,这是 CTAD 固有且已知的限制,如P1021R6中强调的那样([核心]填补类模板参数推导中的漏洞

别名模板的类模板参数推导

虽然类模板参数推导使构造类时的类型推断变得更加容易,但它不适用于类型别名,从而惩罚类型别名的使用并造成不必要的不​​一致。

[...]

最后,本着别名模板只是类型的别名的精神,我们不建议允许程序员专门为别名模板编写显式推导指南。

P1814R0 ( Wording for Class Template Argument Deduction for Alias Templates ) 突破了 P1021 的别名模板部分,并于 2019 年被 CWG 接受,但Clang 尚未实现GCC 甚至没有列出其在论文中的状态

但请注意,在您的情况下,result 也是一个别名模板,因此您实际上并没有比较别名模板的 CTAD 与非别名模板。例如,Clang 拒绝了这两种情况。