【问题标题】:Type deduction for default constructor with defaulted template type具有默认模板类型的默认构造函数的类型推导
【发布时间】:2018-11-01 19:14:00
【问题描述】:

假设我有这个示例类型:

template < class T = void > struct Test { };

template < > struct Test<void> { };

还有这个类型的扣分指南:

template<class T> Test() -> Test<T>;

下面的编译就好了:

Test f;

在 GCC 上。

但是,在 Clang 上。扣分指南需要:

template<class T = void> Test() -> Test<T>;

所以我的问题是:哪个是正确的?

默认模板类型应该同时出现在推导和基类型中,还是只出现在基类型中,并假设它会被编译器拾取。

GCC 和 Clang 的主干版本都在 godbolt.org 上使用-O3 -std=c++17进行了测试

【问题讨论】:

    标签: c++ templates g++ c++17 clang++


    【解决方案1】:

    首先,您实际上并不需要这种类型的推导指南 - 假设类模板参数已经默认。如果您确实提供了扣除指南,则应该是:

    Test() -> Test<void>;
    

    把它做成演绎指南模板是没有意义的。


    也就是说,我认为这不是一个错误......来自任何一个编译器。正如您的示例所做的那样,编写具有非推导模板参数的推导指南没有任何错误

    template<class T> Test() -> Test<T>;
    

    虽然标准允许这种结构,但实际上也没有任何意义。推演指南的重点是……引导推演。如果您提供不可扣除的扣除指南,那有什么意义?此处的 Clang 错误似乎对我很有帮助 - 它提醒您您编写的代码显然是错误的。

    如果我们是迂腐的,那就是叮当声。但实际上,我更喜欢 clang 的结果而不是 gcc 的结果。

    【讨论】:

    • 确实,我也期待来自 GCC 的类似于 Clang 的东西。但更重要的是,感谢您让我知道我可以不用涉及模板。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    相关资源
    最近更新 更多