引用数据类型用自己初始化,这是什么语义?

youngwolf 2012-09-10 12:16:23
今天无意中发现,引用型类成员变量用自己初始化自己,居然编译得过,而且还能用,但这是什么语义呢?不知是否标准?

class base
{
public:
base(int& data_) : data(data) {}
void func() {++data; cout << &data << " " << data << endl;}
protected:
int& data;
}


编译环境:ubuntu 12.04 LTS + g++4.6.3
vc没试过,电脑里面没有。
...全文
119 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xmu_才盛 2012-09-10
  • 打赏
  • 举报
回复
再加上 类初始化前, 允许成员变量引用 没有赋值,, 一旦构造函数开始执行, 类成员引用变量 必须赋值。

综上, lz你只不过钻了一个编译器的 空子而已。。
youngwolf 2012-09-10
  • 打赏
  • 举报
回复
这样的写法第一感肯定是不对,但奇怪g++检测不到,连个警告都没有。这个语法检测应该是很好做的啊!既然g++没有做,我以为有其它语义,后来我多写了几行肯定不会出错的代码,结果崩溃了,所以引用用自己初始化肯定是不对的,看来g++偷懒了,不知道vc会不会。
xmu_才盛 2012-09-10
  • 打赏
  • 举报
回复
本来也可以, 就算为空,那也是一个引用吧? 用一个引用初始化另一个引用, 语法正确的。。。

编译器不管两个引用是否 指向同一个对象

int nA;
int& aa = nA;
int& bb = aa;
这样的语法不一样正确?
ri_aje 2012-09-10
  • 打赏
  • 举报
回复
和下面这句一样

int& a = a;

这叫 undefined behavior,改成下面的就好了。

class base
{
public:
base(int& data) : data(data) {}
void func() {++data; cout << &data << " " << data << endl;}
protected:
int& data;
}
pengzhixi 2012-09-10
  • 打赏
  • 举报
回复
你再想想
youngwolf 2012-09-10
  • 打赏
  • 举报
回复
没有重名,请认真看。
pengzhixi 2012-09-10
  • 打赏
  • 举报
回复
参数名不要和成员变量名重名。
taodm 2012-09-10
  • 打赏
  • 举报
回复
楼主,不要浪费生命,讨论c++标准漏出来的bug feature
ri_aje 2012-09-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

和 int &a=a;完全不是一个概念。

一个参数名,一个类成员变量名。 两者重名了。
[/Quote]
我觉得你误会了,主楼程序中的是类成员变量(int&类型)自己初始化自己,该构造函数中的参数名是 data_,应该用而没有用上,实际上如果只是参数名和类成员变量重名,初始化反而没问题,就像我在 #4 该得一样,因为 unqualified name lookup 会找到正确的 entity。
pengzhixi 2012-09-10
  • 打赏
  • 举报
回复
和 int &a=a;完全不是一个概念。

一个参数名,一个类成员变量名。 两者重名了。
ri_aje 2012-09-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

这样的写法第一感肯定是不对,但奇怪g++检测不到,连个警告都没有。这个语法检测应该是很好做的啊!既然g++没有做,我以为有其它语义,后来我多写了几行肯定不会出错的代码,结果崩溃了,所以引用用自己初始化肯定是不对的,看来g++偷懒了,不知道vc会不会。
[/Quote]
只能说编译器不是万能的,而且有很多种 undefined behavior 标准不要求告警的。楼上说 vs 报警,我试了一下 (vs2012),它给出的警告是 "warning C4100: 'data_' : unreferenced formal parameter",好像没有说 :data(data) 有问题啊?虽然人看了以后,能够顺藤摸瓜的找到问题,但是技术上讲,vs 和 g++ 一样都没有对 self-initialization 报警啊。
youngwolf 2012-09-10
  • 打赏
  • 举报
回复
你举的例子,和在参数化列表里面用自己初始化自己,我觉得显然不一样。

我是无意中发现这个问题的,并非有意,如下:
class echo_socket : public server_socket
{
public echo_socket(st_server& st_server_) : server_socket(st_server_) {}
}
上面是以前的代码,今天我改为:
class file_socket : public server_socket
{
public file_socket(file_server& file_server_) : server_socket(st_server_) {}
}
代码编译完全正常,注意,两种写法都是server_socket(st_server_),对于后面一种,根本没有st_server_这个变量啊,原来它是server_socket的一个引用成员变量。这就等于是引用用自己初始化自己,这个明显可以检测到啊。
xmu_才盛 2012-09-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

这样的写法第一感肯定是不对,但奇怪g++检测不到,连个警告都没有。这个语法检测应该是很好做的啊!既然
……
[/Quote]

vs报警告了。。。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧