随笔-59  评论-36  文章-0  trackbacks-0
前一段时间写了类似于这样的一段代码
class A
{
private:
    
int *const ptr;
public:
    A():ptr(NULL)
    {
    }
};

A one;
A two;
two 
= one;
编译时发现,编译器提示说默认赋值操作符不能用,而当我去掉ptr成员的const关键字后,便好了。当时很纳闷这是怎么搞的。
后来在好心人的帮助下,才意识到ptr是个const,所以默认的赋值操作符不能对ptr进行赋值。

唉,当时知道是这个原因后真的是羞涩难当,自己明知道const不能被赋值是常识问题,但当时却死活没能找出原因。
而更要人命的是我之前在{偶尔学习C++标准} 之 [对象的复制 - 复制构造与赋值操作符] 中就已经对赋值操作符做了一些笔记,但我竟然把一些内容给忘了(也可能是压根就没注意)。

现在重新就自动合成的赋值操作符何时不能使用再单独做一次笔记。

当类中拥有以下一种或几种情况时,隐式定义的赋值操作符是不能使用的:
1.非静态的const成员变量
2.非静态的引用类型成员变量
3.非静态的类类型的成员变量的赋值操作符不可访问
4.(如果有)基类中的赋值操作符不可访问

注,对于拥有以上情况中的一种或多种的类,标准中的用词是:ill-formed。我不知道为什么要用ill-formed(字面意思:不规范),但不管怎样,对于ill-formed,编译器的行为就是,无法编译通过。

后记:希望这次不要再忘记这些内容了。
posted on 2010-05-08 16:21 zhaoyg 阅读(510) 评论(2)  编辑 收藏 引用 所属分类: C/C++学习笔记

评论:
# re: 什么时候自动合成的赋值操作符不能用 2010-05-09 01:36 | 陈梓瀚(vczh)
VC2008允许自动复制引用  回复  更多评论
  
# re: 什么时候自动合成的赋值操作符不能用[未登录] 2010-05-09 17:42 | zhaoyg
@陈梓瀚(vczh)
我刚试了下,好像不行呀,对于引用,编译提示说“operator= 不可用”  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理