$ 10.3/5协变返回类型
“压倒一切的 函数的返回类型应是相同 重写的 功能或协变与类的功能 的返回类型。如果函数d ::˚F 覆盖了一个函数B :: f,其返回 类型的功能是协变 如果它们满足以下 标准:
- 无论是指针 类或引用classes98)
- 类B中的返回类型::˚F 是相同的类,如d :: f的 返回类型的类,或者是 明确的和可访问的直接或间接 基类中 返回类型d的::类F的
- 两个指针或引用具有 相同CV-资格和的 类型中d的返回类型:: f 具有与0相同的cv资格在B :: f的返回类型中,比类 类型更少的cv资格。
struct A{};
struct B : A{};
struct X{
virtual const A * const f(){return 0;}
};
struct Y : X{
virtual const B * volatile f(){return 0;}
};
int main(){
Y b;
X &r = b;
r.f();
}
我写了上面的实验代码并发现科莫的错误/警告被inconsitent。第9行的警告似乎表明,返回类型的cv限定符没有意义。这就是导致代码格式不正确的原因。
"ComeauTest.c", line 5: warning: type qualifier on return type is meaningless
virtual const A * const f(){return 0;}
^
"ComeauTest.c", line 9: warning: type qualifier on return type is meaningless
virtual const B * volatile f(){return 0;}
^
"ComeauTest.c", line 9: error: return type is not identical to nor covariant with
return type "const A *const" of overridden virtual function function
"X::f"
virtual const B * volatile f(){return 0;}
^
所以,问题是,是科莫权在9行给予“警告”的消息?我知道这是一个实现定义的行为,而Comeau只是试图很好。但在这种情况下,它最容易混淆。
我在错误信息中看到volatile,但在示例源代码中看不到。您正在向我们显示您正在编译的代码的代码? – Thanatos 2010-08-29 05:13:06
@Thanatos:我经过OP – Chubsdad 2010-08-29 05:15:41
+1之后纠正了它,詹姆斯是我见过的最晦涩的角落案例。 – Potatoswatter 2010-08-29 07:09:18