荔园在线

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

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


发信人: Dreamer (黄昏·落霞·萤火·街灯), 信区: SoftDev
标  题: 【C++】[FAQ]为何我不能重载“.”、“::”和“sizeof
发信站: 荔园晨风BBS站 (Tue Jun 15 13:44:02 2004), 站内信件


Q: 为何我不能重载“.”、“::”和“sizeof”等操作符?
A: 大部分的操作符是可以被重载的,例外的只有“.”、“::”、“?:”和“
sizeof”。没有什么非禁止operator?:重载的理由,只不过没有必要而已。另外,
expr1?expr2:expr3的重载函数无法保证expr2和expr3中只有一个被执行。
而“sizeof”无法被重载是因为不少内部操作,比如指针加法,都依赖于它,例如
: X a[10];
X* p = &a[3];
X* q = &a[3];
p++; // p points to a[4]
// thus the integer value of p must be
// sizeof(X) larger than the integer value of q


这样,sizeof(X)无法在不违背基本语言规则的前提下表达什么新的语义。
在N::m中,N和m都不是表达式,它们只是编译器“认识”的名字,“::”执行的实
际操作是编译时的名字域解析,并没有表达式的运算牵涉在内。或许有人会觉得重
载一个“x::y”(其中x是实际对象,而非名字域或类名)是一个好主意,但这样
做引入了新的语法[译注:重载的本意是让操作符可以有新的语义,而不是更改语
法——否则会引起混乱],我可不认为新语法带来的复杂性会给我们什么好处。

原则上来说,“.”运算符是可以被重载的,就像“->”一样。不过,这会带来语
义的混淆——我们到底是想和“.”后面的对象打交道呢,还是“.”后面的东东所
实际指向的实体打交道呢?看看这个例子(它假设“.”重载是可以的):

class Y {
public:
void f();
// ...
};

class X { // assume that you can overload .
Y* p;
Y& operator.() { return *p; }
void f();
// ...
};

void g(X& x)
{
x.f(); // X::f or Y::f or error?
}

这个问题有好几种解决方案。在C++标准化之时,何种方案为佳并不明显。细节请
参见《The Design and Evolution of C++》。






--

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.223]


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

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店