荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: 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软件 网络书店