typedef 改变含义

2023-12-13

当我编译以下代码片段时g++

template<class T>
class A
{};

template<class T>
class B
{
    public:
        typedef A<T> A;
};

编译器告诉我

error: declaration of ‘typedef class A<T> B<T>::A’
error: changes meaning of ‘A’ from ‘class A<T>’

另一方面,如果我改变typedef to

typedef ::A<T> A;

一切都编译得很好g++。 Clang++ 3.1 并不关心这两种情况。

为什么会发生这种情况?那么第二个行为标准是什么呢?


g++ 是正确的并且符合标准。来自[3.3.7/1]:

S 类中使用的名称 N 应指代其中的相同声明 上下文以及在 S 的完整范围内重新评估时。否 如果违反此规则,则需要进行诊断。

在 typedef 之前,A提到了::A,但是通过使用 typedef,您现在可以制作A引用被禁止的typedef。然而,自从no diagnostic is required, clang 也符合标准。

jogojapan 的评论解释了这条规则的原因。 对您的代码进行以下更改:

template<class T>
class A
{};

template<class T>
class B
{
    public:
        A a; // <-- What "A" is this referring to?
        typedef     A<T>            A;
};

由于类作用域的工作方式,A a;变得暧昧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

typedef 改变含义 的相关文章

随机推荐