如何解决在按值返回和按常量引用传递时避免临时构造
void func(const Large& param);
和一个包含 Large
的类:
class HoldsLarge {
public:
Large GetByValue() const { return l; };
private:
Large l;
}
如果我这样做
HoldsLarge x;
func(x.GetByValue());
我是否正确理解为 x.GetByValue()
复制构造一个临时文件,该临时文件将通过引用传递给 func
?标准中是否有某些内容允许编译器完全省略临时的构造?毕竟,func
只需要 const
对 HoldsLarge::l
的引用。
我知道我可以简单地通过常量引用返回 HoldsLarge::l
,但我想防止客户端意外创建悬空引用。
解决方法
在少数情况下,允许编译器更改行为(作为优化):对于 NRVO,以及自 C++14 以来对于 new 表达式。
你不属于这些情况。
那么;只要可观察到的行为相同,as-if 规则就允许任何优化。
因此编译器可以进行优化,前提是不改变行为。
如果不知道 func
,就不能安全地做到这一点。
func
可能可以通过其他方式(作为全局)访问 x.l
(或别名)。
例如,跟随 func
将禁止更改。
Large* largePtr; // possibly set to &x.l by any way
void func(const Large& param)
{
print(param.x);
//param might be alias of largePtr
mutate(alias->x);
print(param.x); // const ref should see the modification
// whereas copy don't
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。