c++ 局部类中的依赖名称

1szpjjfi  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(101)
#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不是?在标准中看不出任何东西。

inb24sb2

inb24sb21#

这是CWG 2074,仍然没有解决[强调我的]:

2074.函数模板局部类的类型依赖

根据13.8.3.2 [temp.dep.type]第9段,函数模板中的局部类是依赖的,当且仅当它包含依赖类型的子对象时。但是,举一个例子,

template<typename T> void f() {
    struct X {
      typedef int type;
  #ifdef DEPENDENT
      T x;
  #endif
    };
  X::type y;    // #1
  }
  void g() { f<int>(); }

在#1的处理中存在实现差异,但是是否定义了DEPENDENT似乎没有区别。
[...]
也许正确的答案是,类型应该是依赖的,但是是当前示例化的成员,允许不带typename的名称查找。

补充说明(2022年9月):

目前,术语“当前示例化”仅针对类模板定义,因此不适用于函数模板
此外,此问题的解决方案还应处理本地枚举,特别注意9.7.2 [enum.udecl]第1段:
elaborated-enum-specifier不能命名依赖类型和.如果本地枚举被设置为依赖类型,则此规则(未经修改)将不允许以下合理示例:

template <class T>
void f() {
  enum class E { e1, e2 };
  using enum E;
}

该规范似乎未被充分指定,因为供应商似乎(在实现差异的基础上)强制执行[temp.dep.type]/7.3 [emphasizemine]:
/7一个类型是依赖的,如果它

  • [...]
  • /7.3嵌套类或枚举,它是当前示例化的类的直接成员,

但正如CWG 2074中所指出的,按照[temp.dep.type]/1的 * 当前示例化 * 并不涵盖函数模板的实际规则。

相关问题