这是
CWG 1980
“等价但非功能等价的再声明”:
例如
template<typename T, typename U> using X = T;
template<typename T> X<void, typename T::type> f();
template<typename T> X<void, typename T::other> f();
第二次声明
f
是对第一个的重新定义,但可由sfinae区分,即等效但功能上不等效。
2014年11月会议纪要:
CWG认为这两个声明不应该是等效的。
这仍然是一个活跃的问题。海湾合作委员会的行为更符合这些不同的愿望。
[temp.alias]/2
和
[temp.alias]/3
是否有相关的透明度规则:
当A
模板ID
是指别名模板的专门化,它相当于通过替换其
模板参数
对于
模板参数
在
类型ID
别名模板的。
但是,如果
模板ID
依赖,后续模板参数替换仍应用于
模板ID
.
这里有冲突。在问题的简化示例中,
X<T, U>
是
相等的
到
T
-这意味着两个声明的返回类型都是
void
-但替代仍然适用,这并不意味着他们
相等的
.