c – 由clang采取的免费扣除指南 – 谁是正确的?

c – 由clang采取的免费扣除指南 – 谁是正确的?,第1张

概述请考虑以下代码: template <typename... Types>struct list{ template <typename... Args> list(Args...) { static_assert(sizeof...(Types) > 0); }};template <typename... Args>list(Arg 请考虑以下代码:

template <typename... Types>struct List{    template <typename... Args>    List(Args...)     {        static_assert(sizeof...(Types) > 0);    }};template <typename... Args>List(Args...) -> List<Args...>;int main(){    List l{0,0.1,'a'};}

我希望decltype(l)是List< int,double,char>.不幸的是,g 7.2和g trunk失败了静态断言. clang 5.0.0和clang trunk按预期编译和工作.

godbolt.org conformance view

这是一个g BUG吗?或者,为什么不应该遵循演绎指南

在构造函数上添加SFINAE约束似乎提供了所需的行为:

template <typename... Args,typename = std::enable_if_t<sizeof...(Args) == sizeof...(Types)>>List(Args...) {    static_assert(sizeof...(Types) > 0);}

godbolt.org conformance view

解决方法 这是 gcc bug 80871.问题是,我们最终得到了这组扣除的候选人:

template <class... Types,class... Args>List<Types...> __f(Args... ); // constructortemplate <class... Args>List<Args...>  __f(Args... ); // deduction-guIDe

两者都是有效的(类型……在第一种情况下可以推断为空),但这里的调用应该是模糊的 – 既不比另一种更专业.类型…不参与此处的订购(类似于[temp.deduct.partial]/12中的示例).因此,正确的行为是进入下一个决胜局,即favors deduction-guides.因此,这应该是一个列表< int,char>.

但是,gcc的行为是支持构造函数,因此static_assert触发器因为类型……在那种情况下确实是空的.

总结

以上是内存溢出为你收集整理的c – 由clang采取的免费扣除指南 – 谁是正确的?全部内容,希望文章能够帮你解决c – 由clang采取的免费扣除指南 – 谁是正确的?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1209809.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存