首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++方法调用和类型作用域解析模糊性

C++方法调用和类型作用域解析模糊性
EN

Stack Overflow用户
提问于 2012-06-20 16:21:03
回答 1查看 748关注 0票数 17

我希望标题能描述我想问的问题……

我写了一段代码,和gcc一起编译,并按我的预期工作。但是,它不能用llvm编译,当用icc编译时,代码的执行方式也不同!

下面是这个问题的一个例子:

代码语言:javascript
复制
#include <iostream>

using std::cout; using std::endl;

class A {
public:
  virtual void foo() { cout << "A::foo()" << endl; }
};

class B : public A {
public:
  typedef A  base;
  virtual void foo() { cout << "B::foo()" << endl; }
};

int main() {
  typedef B  base;
  base* bp = new B();
  bp->base::foo(); 
}

gcc输出: A::foo()

icc输出: B::foo()

谁能解释一下这个标准是怎么说的?

EN

回答 1

Stack Overflow用户

发布于 2012-06-20 16:50:19

我认为标准的这一部分是相关的:

3.4.3.1类成员class.qual

1)如果限定id的嵌套名称说明符指定了一个类,则在类(10.2)的作用域中查找在嵌套名称说明符之后指定的名称,下面列出的情况除外。名称应代表该类或其基类之一的一个或多个成员(第10条)。注意:类成员可以在其潜在作用域(3.3.7)中的任何点使用限定id来引用。-end注意:上述名称查找规则的例外情况如下:

-按照3.4.3中指定的方式查找析构函数名称;

-转换函数id的转换类型id的查找方式与类成员访问中的转换类型id的查找方式相同(见3.4.5);

-模板id的模板参数中的名称在整个后缀表达式出现的上下文中查找。

-在使用声明(7.3.3)中指定的名称的查找还会查找隐藏在同一范围(3.3.10)中的类或枚举名称。

在本例中,base::似乎“提名”了一个类,因此查找是在类的作用域中完成的。我不知道如何应用任何异常情况,所以这是类的作用域,因为这样的base等同于A

(5.1.1-8表示在这种情况下它是一个合格的id,3.4.3.1适用)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11115484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档