- 主题:在容纳函数返回的对象时,const T& 和 T 有啥区别?
我的意思是准备好内存地址。。
【 在 z16166 的大作中提到: 】
: 幻觉吧?哈哈
: 参数要在进入函数前准备好。作为返回值的变量没这个要求
--
FROM 59.61.199.*
难道不是返回值优化吗
--
FROM 117.185.158.*
搜一下-Wreturn-local-addr
https://zhuanlan.zhihu.com/p/618070734
【 在 MyWorkLife 的大作中提到: 】
: 你不懂c++,鉴定完毕
--
FROM 221.219.211.*
你看什么资料?知乎。
我们这里都是看godbolt、cppreference,你看知乎——,难怪你不懂c++。
自己找个位置坐下!看别人讨论。
@MyWorkLife 是这个意思吧?
【 在 iwantfly 的大作中提到: 】
: 搜一下-Wreturn-local-addr
:
https://zhuanlan.zhihu.com/p/618070734:
--
FROM 113.140.163.*
这个问题在C++ Primer 6.3.2中有比较详细的论述
总之:不要返回局部变量的指针或引用,否则会报错
如果要返回的值属于很大的数据结构,使用引用返回比值返回更效率
【 在 hgoldfish 的大作中提到: 】
: 弱问,在以下代码里面:
: const ReloadLog &rlog = reload();
: 和写成
: ...................
--
FROM 36.163.208.*
这不是这个问题。
我这里 reload() 返回的是值。前面没写清楚。这个是定义:
ReloadLog reload();
我主要是想问,调用者应该使用 const ReloadLog & 还是使用 ReloadLog 来承载返回值。
目前我是养成了习惯,都用 const ReloadLog & 好像在大多数情况下是可行的。但是编译器未优化编译的话,const ReloadLog & 的效率其实比较低。优化之后则没有区别。
【 在 wanllow 的大作中提到: 】
: 这个问题在C++ Primer 6.3.2中有比较详细的论述
: 总之:不要返回局部变量的指针或引用,否则会报错
: 如果要返回的值属于很大的数据结构,使用引用返回比值返回更效率
: ...................
--
修改:hgoldfish FROM 121.207.149.*
FROM 121.207.149.*
懂你意思了,你不是在问函数返回值用什么类型,而是接收函数返回值的那个receiver,
关于这个效率问题,愿听高见
【 在 hgoldfish 的大作中提到: 】
: 这不是这个问题。
: 我这里 reload() 返回的是值。前面没写清楚。这个是定义:
: ReloadLog reload();
: ...................
--
FROM 106.44.1.*
由于现代编译器大多支持返回值优化(RVO)和具名返回值优化(NRVO),reload函数写的时
候稍微注意点,第二种写法都不会多一次拷贝构造的,不会有性能损失
【 在 hgoldfish 的大作中提到: 】
: 弱问,在以下代码里面:
: const ReloadLog &rlog = reload();
: 和写成
: ...................
--
FROM 218.91.250.*
【 在 hgoldfish 的大作中提到: 】
: 这不是这个问题。
: 我这里 reload() 返回的是值。前面没写清楚。这个是定义:
: ReloadLog reload();
: ...................
我也觉得, 无论返回的是临时变量还是临时返回值, 返回临时变量的引用都不是一个正确的方式,
虽然, 也未必会野指针。
除非你显示的提供移动拷贝构造函数。 然后使用std::move。
也就是
ReloadLog(ReloadLog &&o){}
--
FROM 115.171.154.*
public:
ReloadLog reload();
const ReloadLog &rlog = reload();
我也觉得这种用法是一种非常规用法
从逻辑上c++是不设计这种语义的支持的
严格上来说是有歧义的
虽然可能编译器能通过,并不推荐这种用法
这种声明正常应该使用的模式应该还是这样
ReloadLog rlog = reload();
【 在 poggy 的大作中提到: 】
: 我也觉得, 无论返回的是临时变量还是临时返回值, 返回临时变量的引用都不是一个正确的方式,
: 虽然, 也未必会野指针。
: 除非你显示的提供移动拷贝构造函数。 然后使用std::move。
: ...................
--
FROM 111.194.202.*