荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: bso (BSO's So Open), 信区: Program
标 题: [ZZ]一个主流编译器与标准不容的Member Access Control Bug
发信站: 荔园晨风BBS站 (Thu Sep 14 09:01:53 2006), 站内
发信人: NetMD (C++ is nothing), 信区: CPlusPlus
标 题: 一个主流编译器bug,关于member access control
发信站: 水木社区 (Mon Sep 11 15:41:28 2006), 站内
上两天写一个小程序需要用一个functor来排序,为了代码紧凑用了一个nested
class,代码大致如下
[code
class foo {
int i_;
public:
struct less {
bool operator()(const foo& lhs, const foo& rhs) const {
return (lhs.i_ < rhs.i_); // foo::i_ is private!
}
};
};
end code]
结果VC2005居然编译通过了...越想越灵异,马上我又用了Comeau4.3.8和g++3.3.1
测试,居然也都过了!
没办法,翻看标准来仲裁吧,相关内容在11.8中,并且1998和2003的内容是一样的!
相关条款的内容就不复述了,简单一句话就是access control依然有效且跟nested
class没啥关系!11.8给出了两段示例代码,我好奇的测试了一下,这一试不得了,
发现几乎我能找到的所有主流编译器都不符合标准。。。
参与测试的编译器列表:VC2005, VC2003SP1, VC6SP6, Comeau4.3.8, g++3.3.1,
g++4.0.4, g++4.1.0, ICC9.0
[code from 11.8-1
class E {
int x;
class B { };
class I {
B b; // error: E::B is private
int y;
void f(E* p, int i)
{
p->x = i; // error: E::x is private
}
};
int g(I* p)
{
return p->y; // error: I::y is private
}
};
end code]
对于这段代码,除了VC6SP6,所有的编译器表现都一样,只找出了标红的第三个错
误,标准提到的前两条被无视了。。。有些编译器比如g++可能会给出一些warning
但是与本话题无关,忽略之。而VC6SP6更狂野,编译通过了。。。
[code from 11.8-2
class C {
class A { };
A *p; // OK
class B : A // OK
{
A *q; // OK because of injection of name A in A
C::A *r; // error, C::A is inaccessible
B *s; // OK because of injection of name B in B
C::B *t; // error, C::B is inaccessible
};
};
end code]
对于这段代码,照样是所有的编译器都有bug,只是VC6SP6再一次特立独行了:除
了VC6SP6,所有的编译器都通过了这段代码,标准给出的两个错误都没无视了。。
VC6SP6倒是编译失败,原因却是因为undefined type 'C'。。。这样一来后面的
access control肯定就没有继续做了
总结:第一,尽量放弃VC6吧,第二,Comeau果然不是100%标准的C++编译器啊-_-
btw,感谢ctrlz和FlyingBoy还有Curvelet提供的技术支持!
--
欢迎访问Programming版和CPlusPlus版
※ 修改:·NetMD 于 Sep 11 18:08:07 修改本文·[FROM: 159.226.228.*]
※ 来源:·水木社区 newsmth.net·[FROM: 159.226.228.*]
--
※ 来源·流星射手BBS站 bbs.archer.com.cn·[FROM:流星射手]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店