我希望标题能描述我想问的问题……
我写了一段代码,和gcc一起编译,并按我的预期工作。但是,它不能用llvm编译,当用icc编译时,代码的执行方式也不同!
下面是这个问题的一个例子:
#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()
谁能解释一下这个标准是怎么说的?
发布于 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适用)
https://stackoverflow.com/questions/11115484
复制相似问题