C 17中的新:默认情况下匹配的模板模板
New in C++17: template templates that match by default
C 17标准说可以做到这一点:
template<class T, class U = T> class B { /* ... */ };
template<template<class> class P> class X { /* ... */ };
X<B> xb; // OK in C++17; ill formed in C++14
C 14标准使同一代码成为错误。
旧的C 14规则对我来说很有意义。新的C 17规则没有。发生了什么变化?
供参考,上述示例代码
- 在教派中。C 17标准的17.3.3(3)(此处草稿)和
- 在教派中。C 14标准的14.3.3(2或3)(此处草稿)。
对于简短,示例代码省略了详细信息。让我们扩展样本:
template<class T, class U = T> class B { /* ... */ };
template<template<class> class P> class X {
P<int, int> pii; // error: P has been declared to take only one argument
P<int> pi; // OK
P<char> pc; // OK
/* ... */
};
X<B> xb; // OK in C++17; ill formed in C++14
最终行将P<int>
解析为B<int>
。的确,最后一个表示B<int, int>
,但是鉴于默认参数,B<int>
是一种写入的明确方法。
原则上没有理由C 14无法理解这一点,但是对于C 14来说,推理链太复杂了。三年后,C 17理解。
顺便说一句,Clang C 编译器提供了解决此问题的-frelaxed-template-template-args
选项。如果在Clang上使用模板模板,则可以断言此选项。(@rakete1111因引起叮当声的关注而得到认可。)
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 是默认情况下分配给char数组常量的值
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- CMake:默认情况下,如何使add_custom_command输出保持最新?
- 在没有默认构造函数的情况下创建的派生对象
- 在 C++ 中,默认情况下构造函数为类的数据成员提供的值是多少?
- 如何防止类中的类对象尝试在没有默认构造函数的情况下自动构造自身?
- Vulkan默认情况下已经有多线程了吗
- 默认情况下,"std::shared_ptr"不应该使用"std::d efault_delete"吗?
- 为什么C++默认情况下不移动构造右值引用?
- 默认情况下初始化时 POD 是否给予特殊处理 (C++14)?
- 在不使用默认构造函数的情况下声明 POD 结构时,会实例化什么?
- 默认情况下,C++ 开关运行时循环
- 谷歌嘲笑!我的测试出错.默认情况下,呼叫将返回调用
- 如何将用户下载的标头文件添加到系统中默认情况下的标题文件列表
- 默认情况下C++数组作为参数引用
- 为什么默认情况下初始化局部变量
- 默认情况下,我如何在不使用继承的情况下使用所有构造函数
- 为什么我能够在没有默认构造函数的情况下默认构造对象