带非类型模板参数的Alias Template编译疑问:为何代码可通过编译?
问题解答:为什么这段C++代码能正常编译?
你原本预期以下代码无法编译,因为觉得它会被解析成void f(int<4> foo = 0);,但实际它能正常通过编译,疑惑点在于int并非模板,为何代码能正常工作。
实际可编译的C++代码:
template <int> using A = int; void f(A<4> foo = 0);
你预期会被错误解析的代码:
void f(int<4> foo = 0);
原因解析:
编译器在解析A<4>时,会先查找名字A的定义——这里A是一个模板别名(template alias),定义为template <int> using A = int;。当遇到A<4>时,编译器会先将其识别为模板实例化:用模板实参4实例化模板A,得到的结果就是int。
也就是说,A<4>最终会被替换为int,所以函数声明实际上等价于:
void f(int foo = 0);
这显然是合法的C++代码,自然能正常编译。
你担心的int<4>情况根本不会发生,因为编译器在处理A<4>时,优先识别A为模板名,而非直接把A替换成int后再解析<4>——模板别名的实例化是整体替换,不是先替换名字再处理模板参数部分。
内容的提问来源于stack exchange,提问作者embeddedstack
相关产品推荐
相关产品推荐

