类模板中的 Typedef 计算

Typedef evaluation in a class template

本文关键字:Typedef 计算      更新时间:2023-10-16

以下代码使用 g++ 编译,但无法使用 clang 编译。

struct X;
template <typename T>
struct Traits
{
    typedef typename Traits<T>::Container Container;
};
template <>
struct Traits<X>
{
    typedef std::vector<X *> Container;
};
int main()
{
    Traits<X>::Container container;
    return EXIT_SUCCESS;
}

叮当错误消息:

main.cpp:9:30: error: no type named 'Container' in 'Traits<T>'

编译器是否应该在不用实际类型替换模板参数的情况下计算 typedef?哪个编译器是正确的?

叮当当:http://coliru.stacked-crooked.com/a/fef7725827074e4f

海湾合作委员会:http://coliru.stacked-crooked.com/a/79e17031fcabcd83

template <typename T>
struct Traits {
  typedef typename Traits<T>::Container Container;
};

这是格式不正确的,不需要诊断。 没有任何T使上述(主要(专用化可以生成有效的代码。

另一个专业化的存在没有区别。 编译器可以自由地做任何事情,包括给出虚假的错误消息。 编译它是自由的。 只有当您在程序的其他地方有一个名为foo的变量时,或者如果月球是新的,才能免费生成错误。 有些如果这些是执行质量差。

在实践中,这意味着编译器可以自由地假设主要专用化对某种类型T有效(即,其中没有无限递归(,并在相对不相关的代码中胡说八道,因为它做出了这个假设。