#include <type_traits>
template<typename... Ts>
void boo()
{
struct A
{
struct B {};
};
static_assert(std::is_class_v<A>);
static_assert(std::is_class_v<A::B>); // compilation failure; need typename.
}
int main()
{
boo<int>();
}
为什么A::B
是一个依赖名称,而A
不是?在标准中看不出任何东西。
1条答案
按热度按时间inb24sb21#
这是CWG 2074,仍然没有解决[强调我的]:
2074.函数模板局部类的类型依赖
根据13.8.3.2 [temp.dep.type]第9段,函数模板中的局部类是依赖的,当且仅当它包含依赖类型的子对象时。但是,举一个例子,
在#1的处理中存在实现差异,但是是否定义了DEPENDENT似乎没有区别。
[...]
也许正确的答案是,类型应该是依赖的,但是是当前示例化的成员,允许不带typename的名称查找。
补充说明(2022年9月):
目前,术语“当前示例化”仅针对类模板定义,因此不适用于函数模板。
此外,此问题的解决方案还应处理本地枚举,特别注意9.7.2 [enum.udecl]第1段:
elaborated-enum-specifier不能命名依赖类型和.如果本地枚举被设置为依赖类型,则此规则(未经修改)将不允许以下合理示例:
该规范似乎未被充分指定,因为供应商似乎(在实现差异的基础上)强制执行[temp.dep.type]/7.3 [emphasizemine]:
/7一个类型是依赖的,如果它
但正如CWG 2074中所指出的,按照[temp.dep.type]/1的 * 当前示例化 * 并不涵盖函数模板的实际规则。