gpt4 book ai didi

c++ - 在 typedef 和 new 中使用 typename 关键字

转载 作者:IT老高 更新时间:2023-10-28 21:53:12 25 4
gpt4 key购买 nike

考虑这段代码,

template<class T>
struct Sample
{
typename T::X *x; //declare pointer to T's X
};

在上面的代码中,编译器需要关键字typename,以便消除模板中嵌套类型和嵌套值的歧义。这意味着,在没有 typename 关键字的情况下,编译器会将其解释为 T::X 与 x 的乘积,

T::X *x; //multiply T::X with x

所以在这种可能出现歧义的情况下,关键字typename变成necessity,以消除歧义。但是,上下文本身消除歧义的情况很少。 other topic讨论了基类和函数参数的上下文(尽管后者并没有消除歧义)。在这个话题中,我特别想讨论另外两个似乎明确,但我们仍然需要编写typename

typedef typename T::X xtype;
pX = new typename T::X;

在这两种情况下,关键字 typedefnew 足以让编译器清楚地知道后面是 type不是 值(value)

所以我的问题是,为什么编译器仍然需要 typename 关键字,即使在明确的情况下,例如我们使用 typedefnew ?


编辑(在阅读 Johannes Schaub 的回复后):

//typedef NOT followed by a type!
int typedef A;

这种语法要求我稍微修改一下我的问题,以便其他人可以看到我试图提出的观点。

考虑一下,

T::X typedef *x;

所以从上下文来看,T::X 是一个类型,不管它出现在 before typedef 还是 typedef之后。 除非 C++ 允许我们编写 typedef 5 五typedef T::value t_value(其中 T::value 是 value), typedef 本身的存在消除了所有歧义,因此,typename 似乎是标准的不必要要求(在这种情况下)new 同样的论点也成立。


另外,我编写了一个类模板,它使用这个结构作为模板参数:

struct A 
{
struct X { string name; };
static const int X = 100;
};

我特别想知道下面的代码(来自构造函数)是否正确(可移植),

//two interesting statements
pX = new typename T::X; //T::X means struct X
product = T::X * p; //but here, T::X means int X

完整代码是here在ideone。回复前请看一下。 :-)

最佳答案

C++ 语法比这更疯狂。

// typedef NOT followed by a type!
int typedef A;

// new NOT followed by a type!
new (0) int;

其他人对您的示例发表了评论。 typename 说明符不会产生忽略非类型名称的查找。所以如果你说 new typename T::X,并且在 T 中有一个对象名称 X,它仍然会被找到而不是类型名称 X (但是,GCC 在查找 typename 之后的名称时会忽略非类型名称。但这不符合标准)。


修改答案:

Consider this,

T::X typedef *x;

So from the context, it's still clear enough to the compiler that T::X is a type, no matter whether it appears before typedef,or after typedef.

编译器必须知道何时声明说明符和(即“类型部分”以及声明符部分何时开始(即“名称”部分)。有些声明类型部分为空:

// constructor definitions don't need a type section
MyClass::MyClass() { }

// conversion function definitions don't need a type section
MyClass::operator int() { }

如果您指定的名字不是类型,则类型部分结束,名称部分开始。说 T::X 告诉编译器:

Now I want to define T::X.

它从左到右读取,所以当它遇到 typedef 时会认为你忘记了分号。在类内部,解释略有不同,但也很相似。这是一个简单而有效的解析。

Same argument holds true for new as well.

我倾向于同意你的观点。从语法上讲,它应该是明确的 if 你去掉括号。由于我从未编写过 C++ 解析器,因此可能存在我没有看到的隐藏陷阱。

new 这样在语言的极端情况下每次添加 typename 都可能需要编译器和标准编写者进行大量设计,同时仍需要 typename 用于绝大多数其他需要它的情况。我不认为这是有返回的。

关于c++ - 在 typedef 和 new 中使用 typename 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4421306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com