老问题

Jinhao 2005-11-22 09:56:13
对于 临时对象 只能绑定到 const-ref 上,这是没有怀疑的。而C++对这点的要求也是为了避免代码中出现bug,不过有种情况好象与这点正好相反。

class T
{
public:
T& get_instance(){ return *this; }
//其他的部分
};

void fun(T& r)
{
//对r操作
}

int main()
{
fun(T().get_instance());
}
上面那段代码完全可以通过,其中对get_instance的调用,让编译器觉察到该处表达式的确是一个左值。对于这段代码来说,应该是绝对安全的。但是对于下面这段代码来说,就绝对地不安全了

T& r = T().get_instance();
//对r操作

这算是语言的纰漏吗?
...全文
256 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jinhao 2005-11-27
  • 打赏
  • 举报
回复
问题的关键好象应该是 禁止将右值从形式上转换为左值
wanguodu 2005-11-23
  • 打赏
  • 举报
回复
语法的作用是尽可能的帮助程序员少犯错误,但是不可能完全防止。看看下面的程序:

#include <iostream>
using namespace std;

int f()
{
return 2;
}

const int x = f();

int main()
{
cout << x << endl;

int *p = (int *)&x;
*p = 3;

cout << x << endl;

return 0;
}

在VC6上打印为:2 3,也就是常量x被改变了。
cunsh 2005-11-23
  • 打赏
  • 举报
回复
楼上.你说生成两个对象????????

我试的时候只是 前面的T& r = T().get_instance(); //构造了1个析构了1个.

T& r = T(); //构造了一个.没调用析构函数.
JohnTitor 2005-11-22
  • 打赏
  • 举报
回复
顺便再请教一下,为什么T& r = T().get_instance();只生成一个对象,
而T& r = T();却生成两个对象呢?不解
xiaocai0001 2005-11-22
  • 打赏
  • 举报
回复
修改了也没用~~

汗~
xiaocai0001 2005-11-22
  • 打赏
  • 举报
回复
如果对原来的函数不进行修改, 确实会出现那样的问题

引用指向了一个临时的变量.
Jinhao 2005-11-22
  • 打赏
  • 举报
回复
to xiaocai0001
那似乎不是解决之道,看看这个代码
const T& r = T().get_instance();

这个代码和上面代码是一样有问题的。问题的本质也一样,不过不是和我开帖子的本意一致。
嘿嘿
JohnTitor 2005-11-22
  • 打赏
  • 举报
回复
问题是T& r = T();也能够通过,并且构造了两个对象,一个对象在离开该语句时就析构了,
另外一个对象在离开包含该语句的{ }块时才析构,
还请老大解释
xiaocai0001 2005-11-22
  • 打赏
  • 举报
回复
补充一下,
不是修改那个函数
而是添加个const T& get_instance() const { return *this; }
原来的T& get_instance(){ return *this; }也保留

道理和operator[]重载的一样.

Effective C++ 在Item 21: Use const whenever possible一章有论述

// operator[] for non-const objects
char& operator[](int position)
{ return data[position]; }
// operator[] for const objects
const char& operator[](int position) const
{ return data[position]; }
xiaocai0001 2005-11-22
  • 打赏
  • 举报
回复
如果你不想出现这样的问题
只需要修改一下函数的声明
T& get_instance(){ return *this; }
改成
const T& get_instance() const { return *this; }

这样T& r = T().get_instance();
这个语句就会编译出错.

64,654

社区成员

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

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