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)
有没有办法为我的别名编写推导指南,以便它也能正常工作?
有没有办法为我的别名编写推导指南,以便它也能正常工作?
不可以,由于别名模板只是类型的别名,因此在设计上不允许专门为别名模板编写显式推导指南。
相反,这是 CTAD 固有且已知的限制,如P1021R6中强调的那样([核心]填补类模板参数推导中的漏洞)
别名模板的类模板参数推导
虽然类模板参数推导使构造类时的类型推断变得更加容易,但它不适用于类型别名,从而惩罚类型别名的使用并造成不必要的不一致。
[...]
最后,本着别名模板只是类型的别名的精神,我们不建议允许程序员专门为别名模板编写显式推导指南。
P1814R0 ( Wording for Class Template Argument Deduction for Alias Templates ) 突破了 P1021 的别名模板部分,并于 2019 年被 CWG 接受,但Clang 尚未实现,GCC 甚至没有列出其在论文中的状态。
但请注意,在您的情况下,result 也是一个别名模板,因此您实际上并没有比较别名模板的 CTAD 与非别名模板。例如,Clang 拒绝了这两种情况。
| 归档时间: |
|
| 查看次数: |
104 次 |
| 最近记录: |