如何解决C ++ 17调用不带尖括号的模板类的静态方法
在C ++ 17中,声明实例时可以省略尖括号<>
。但是为什么从模板类调用静态方法时仍需要它们呢?
#include <iostream>
using namespace std;
template<typename T = void> struct A
{
static const int i = 10;
};
int main() {
A a; // compile
int i = A::i; // does not compile
return 0;
}
解决方法
因为语言功能(Class template argument deduction)仅涉及构造对象。它基于带有构造函数和推论指南的重载解析。
对于静态数据成员,这将是一个非常有限的功能-只有在所有模板参数都默认情况下,它才可能工作,此时您仅保存两个字符(因为A::i
仅可以保存推导为A<>::i
)。
假设使用静态成员函数,它可能会更有趣(因为成员函数可以满足与构造函数相同的目的),但由于必须在每个作用域上基本执行该步骤,因此会使作用域查找复杂化。
但是无论如何,CTAD只适用于构造对象,因为那是它试图解决的问题,并且这是它唯一要解决的问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。