问题描述
在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只适用于构造对象,因为那是它试图解决的问题,并且这是它唯一要解决的问题。