ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 模板模板参数和默认值

2019-09-27 22:06:32  阅读:313  来源: 互联网

标签:template-templates c c11 variadic-templates c17


参见英文答案 > Deducing first template argument with other template parameters defaulted                                    2个
请考虑以下代码:

template<typename T>
struct A { };

// same as A, but with one extra defaulted parameter
template<typename T, typename F = int>
struct B { };

template<template<typename> typename T>
T<int> build() { return {}; }

int main()
{
    build<A>();  // works in gcc and clang
    build<B>();  // works in gcc, does not work in clang
}

g(7.3.0)编译代码就好了,但是,clang(5.0.1)会发出以下信息:

example.cpp:14:5: error: no matching function for call to 'build'
    build<B>();  // works in gcc, does not work in clang
    ^~~~~~~~
example.cpp:9:8: note: candidate template ignored: invalid
      explicitly-specified argument for template parameter 'T'
T<int> build() { return {}; }

哪个编译器是对的?

注意:
重要的一点显然是:

template<template<typename> typename T>

因为两个编译器都满意:

template<template<typename...> typename T>

所以问题是在传递模板模板参数时是否应该考虑默认值.

解决方法:

据我所知,你的代码从C17开始是正确的,之前错了.

根据P0522R0,这是新标准的一部分,我在其中看到一个与您的代码非常非常相似的示例(请参阅“概述”):

template <template <typename> class> void FD();
template <typename, typename = int> struct SD { /* ... */ };
FD<SD>();  // OK; error before this paper (CWG 150)

根据compiler support tables in ccpreference,g支持版本7的P0522R0,从版本4开始,因此两个编译器都应该支持您的代码.

但是在this page看表,对llvm(clang)5的支持被定义为“部分”,并且根据一个说明,

(12): Despite being the the resolution to a Defect Report, this feature is disabled by default in all language versions, and can be enabled explicitly with the flag -frelaxed-template-template-args in Clang 4 onwards. The change to the standard lacks a corresponding change for template partial ordering, resulting in ambiguity errors for reasonable and previously-valid code. This issue is expected to be rectified soon.

因此,冒着风险,您可以尝试使用标志-frelaxed-template-template-args.

标签:template-templates,c,c11,variadic-templates,c17
来源: https://codeday.me/bug/20190927/1824818.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有