gpt4 book ai didi

c++ - 透明地将临时对象插入调用者的范围

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:02 25 4
gpt4 key购买 nike

在 C++ 中,operator-> 具有特殊的语义,如果返回的类型不是指针,它将再次对该类型调用 operator->。但是,中间值由调用表达式保留为临时值。这允许代码检测返回值的变化:

template<class T>
class wrapper
{
// ...
T val;

struct arrow_helper
{
arrow_helper(const T& temp)
: temp(temp){}
T temp;
T* operator->() { return &temp; }
~arrow_helper() { std::cout << "modified to " << temp << '\n'; }
};

arrow_helper operator->() { return{ val }; }
//return const value to prevent mistakes
const T operator*() const { return val; }
}

然后可以透明地访问T的成员:

wrapper<Foo> f(/*...*/);
f->bar = 6;

这样做有什么可能出错的地方吗?另外,有没有办法用 operator-> 以外的函数来实现这种效果?

编辑:我遇到的另一个问题是像这样的表达式

f->bar = f->bar + 6;

因为当来自第二个 operator->arrow_helper 被破坏时,它会将值重新覆盖回原始值。我的半优雅解决方案是让 arrow_helper 有一个隐藏的 T orig,并在析构函数中使用 assert(orig == *owner) .

最佳答案

不保证会捕获所有更改:

Foo &x = f->bar;
x = 6; /* undetected change */

关于c++ - 透明地将临时对象插入调用者的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28588537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com