- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
考虑这段代码,
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;
在这两种情况下,关键字 typedef
和 new
足以让编译器清楚地知道后面是 type、不是 值(value)。
所以我的问题是,为什么编译器仍然需要 typename
关键字,即使在明确的情况下,例如我们使用 typedef
和 new
?
//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/
如果我创建一个对象时没有使用 new 关键字,例如“Object s(someval)”,但该对象的构造函数使用了 new,当该对象超出范围时,是否会调用析构函数为其分配新的空间?我感觉好像是,但我不
在 SQL 语法中,我发现奇怪的规则表明 select * from ONLY (t1)是有效的 SQL。 我的问题是:什么是 ONLY在这种情况下是什么意思? 它在规范的“7.6 table ref
为什么使用 $(this) 而不是重新选择类很重要? 我在代码中使用了大量的动画和 CSS 编辑,并且我知道可以使用 $(this) 来简化它。 最佳答案 当您通过 jQuery 执行 DOM 查询(
我正在尝试使用 IN 关键字编写查询。 表A 属性标识、属性名称 表B key 、属性标识、属性值 根据提供的 key ,我想返回所有 attrName、attrVal 组合。结果将包含两个表中的列。
这个问题在这里已经有了答案: Why would you use "AS" when aliasing a SQL table? (8 个答案) 关闭 9 年前。 我不擅长写查询,但是从我开始使用
我读过,在 Java 中,您不必将 this 关键字显式绑定(bind)到对象,它由解释器完成。它与 Javascript 相反,在 Javascript 中你总是必须知道 this 的值。但是 Ja
Swift 中“with”关键字的用途是什么?到目前为止,我发现如果您需要覆盖现有的全局函数,例如 toDebugString,可以使用该关键字。 // without "with" you
这个问题在这里已经有了答案: What does the keyword "where" in a class declaration do? (7 个答案) 关闭 9 年前。 在下面的一段代码中(
免责声明:swift 菜鸟 您好,我刚刚开始学习 Swift,正在学习 Swift 编程语言(Apple 在 WWDC 期间发布的书籍),并且想知道“where”关键字是什么。它用于 let vege
深入研究文档后,我找不到以下问题的答案: 是否有任何理由反对使用 this 来引用当前对象,如下例所示? type MyStruct struct { someField string } fun
前言 最近在做THINKPHP开发项目中,用到了 parent:: 关键字,实际上 parent::关键字 是PHP中常要用到的一个功能,这不仅仅是在 THINKPHP 项目开发中,即使是一个小型
我们都知道且经常用到 unsigned 关键字,但有没有想过,与此对应的 signed 关键字有啥用? 复制代码 代码如下: int i = 0; signed
this关键字再java里面是一个我认为非常不好理解的概念,:)也许是太笨的原因 this 关键字的含义:可为以调用了其方法的那个对象生成相应的句柄。 怎么理解这段话呢? thinking i
一 什么是 synchronized synchronized 关键字提供了一种锁机制,能够确保共享变量互斥访问,从而防止数据不一致问题的出现。 synchronized 关键字包括 monitor
最近看了几篇 synchronized 关键字的相关文章,收获很大,想着总结一下该关键字的相关内容。 1、synchronized 的作用 原子性:所谓原子性就是指一个操作或者多个操作,要么全部执行并
在本教程中,您将借助示例了解 JavaScript 对象方法和 this 关键字。 在 JavaScript 中,对象也可以包含函数。例如, // object containing meth
有人可以解释一下 PHP“with”的作用吗? 示例开始: 假设我有一个类: \App\fa_batch 这句话有什么区别: $w = (with (new \App\fa_batch))
这个问题在这里已经有了答案: What is the difference between using the colon and as syntax for declaring type? (2
如果我在 WHERE 子句中使用以下任一项,是否会有很大不同: WHERE [Process Code] = 1 AND ([Material ID] = 'PLT' OR [Material ID]
This question is unlikely to help any future visitors; it is only relevant to a small geographic are
我是一名优秀的程序员,十分优秀!