- 主题:在容纳函数返回的对象时,const T& 和 T 有啥区别?
一群人在这瞎扯。。
如果函数内部是引用某个变量(如类成员函数返回某成员变量) 用1
否则用2,没有任何性能问题。
用2的优点是,读代码的人一看就知道不是引用别的成员,而是返回了一个临时变量
用1,可能是引用类成员变量(这个时候不应用2),也可能是返回临时变量,容易引起歧义。
【 在 hgoldfish 的大作中提到: 】
: 弱问,在以下代码里面:const ReloadLog &rlog = r ...
--
FROM 223.104.68.*
这里显然是从函数返回一个临时对象
然后绑定到一个const引用
你的意思这样不行?
X func() {
X a{};
return a;
}
const X& x = func();
【 在 iwantfly 的大作中提到: 】
: 标 题: Re: 在容纳函数返回的对象时,const T& 和 T 有啥区别?
: 发信站: 水木社区 (Sat Feb 22 22:21:27 2025), 站内
:
: 多半是个return m_reloadLog;
: return 临时变量的引用是非法操作
:
: 【 在 MyWorkLife 的大作中提到: 】
: : 应该没啥区别
: : 开优化以后都能避免额外的拷贝
: : 不开的话应该下面那个可能会多一个拷贝构造
: : ...................
:
: --
:
: ※ 来源:·水木社区 mysmth.net·[FROM: 111.194.200.*]
--
FROM 117.129.54.*
你的意思是这样行?
哈哈
【 在 MyWorkLife 的大作中提到: 】
: 这里显然是从函数返回一个临时对象
: 然后绑定到一个const引用
: 你的意思这样不行?
: ...................
--
FROM 111.194.200.*
【 在 iwantfly 的大作中提到: 】
: 多半是个return m_reloadLog;
: return 临时变量的引用是非法操作
:
你没细看, 楼主的函数返回的就是T,
如果开优化, 确实可能, 使不使用引用, 那个赋值的拷贝都会被省略。
性能上可能并没有太大区别。
--
FROM 124.126.0.*
返回引用的常见函数是左值操作符重载
当然,也可能用于返回动态生命周期的引用的函数
而不是返回临时变量的引用
【 在 iwantfly 的大作中提到: 】
: 多半是个return m_reloadLog;
: return 临时变量的引用是非法操作
--
FROM 120.253.228.*
你不懂c++,鉴定完毕
【 在 iwantfly 的大作中提到: 】
: 标 题: Re: 在容纳函数返回的对象时,const T& 和 T 有啥区别?
: 发信站: 水木社区 (Sun Feb 23 07:56:00 2025), 站内
:
: 你的意思是这样行?
: 哈哈
:
: 【 在 MyWorkLife 的大作中提到: 】
: : 这里显然是从函数返回一个临时对象
: : 然后绑定到一个const引用
: : 你的意思这样不行?
: : ...................
:
: --
:
: ※ 来源:·水木社区 mysmth.net·[FROM: 111.194.200.*]
--
FROM 117.129.54.*
基本常识
变量名,引用,数组,指针本质都是指针。
引用和指针的区别:
1.不能指向NULL
2.一次指定后不能修改指向
这样,既有指针的好处,又能防止野指针。
指针的好处就是不用重复拷贝。
【 在 hgoldfish 的大作中提到: 】
: 弱问,在以下代码里面:
: const ReloadLog &rlog = reload();
: 和写成
: ...................
--
FROM 221.219.188.*
chatgpt 一般建议:
如果 reload() 返回的是 const ReloadLog &,优先用 const ReloadLog &rlog = reload();
如果 reload() 返回的是 ReloadLog(临时对象),用 ReloadLog rlog = reload(); 可能更安全,避免悬垂。
--
FROM 114.254.115.*
嗯。上面写的就是返回个临时变量。开 godbolt 看,使用`ReloadLog rlog =`这个写法,编译器都会直接优化成这个临时变量的引用。不会有其它的操作。等效代码是:
ReloadLog *rlog = alloca(sizeof(ReloadLog));
reload(rlog);
void reload(RelogLog *rlog) {
*(new(rlog) ReloadLog()) = ...; // return
}
是否可以说,c++ 的返回值,其实都是 c++ 函数的一个隐式参数?
【 在 z16166 的大作中提到: 】
: chatgpt 一般建议:
: 如果 reload() 返回的是 const ReloadLog &,优先用 const ReloadLog &rlog = reload();
: 如果 reload() 返回的是 ReloadLog(临时对象),用 ReloadLog rlog = reload(); 可能更安全,避免悬垂。
: ...................
--
修改:hgoldfish FROM 59.61.199.*
FROM 59.61.199.*
幻觉吧?哈哈
参数要在进入函数前准备好。作为返回值的变量没这个要求
【 在 hgoldfish 的大作中提到: 】
: 嗯。上面写的就是返回个临时变量。开 godbolt 看,使用`ReloadLog rlog =`这个写法,编译器都会直接优化成这个临时变量的引用。不会有其它的操作。等效代码是:
: ReloadLog *rlog = alloca(sizeof(ReloadLog));
: reload(rlog);
: ...................
--
FROM 114.254.115.*