gpt4 book ai didi

c++ - C++ 中的只写引用?

转载 作者:行者123 更新时间:2023-11-30 02:11:51 24 4
gpt4 key购买 nike

有没有办法编写对对象的只写引用?例如,假设有一个互斥类:

template <class T> class mutex {
protected:
T _data;
public:
mutex();
void lock(); //locks the mutex
void unlock(); //unlocks the mutex
T& data(); //returns a reference to the data, or throws an exception if lock is unowned
};

有没有办法保证不能这样做:

mutex<type> foo;
type& ref;
foo.lock();
foo.data().do_stuff();
ref = foo.data();
foo.unlock();
//I have a unguarded reference to foo now

另一方面,这值得吗?我知道有些人假设程序员不会故意破坏系统,但是,为什么我们首先要有私有(private)变量,嗯?直接说它是“未定义的行为”会很好,但这似乎有点太不安全了。

编辑:好的,我理解 setter 例程的想法,但这将如何实现?

mutex<vector<int> > foo;
foo.lock();
for (int i=0; i < 10; i++) {
foo.data().push_back(i);
}

foo.unlock();使用 set routine 每次写入都需要一个拷贝:

mutex<vector<int> > foo;
foo.lock();
for (int i=0; i < 10; i++) {
vector<int> copy = foo.read();
copy.push_back(i);
foo.write(copy);
}

尽管您可以在这种特定情况下进行微不足道的优化,例如,如果多个不同的线程都在推送元素,甚至可能删除一些元素,这可能会导致相当多的内存复制(即每个关键部分一个)。

最佳答案

是的,您可以创建一个包装类,它在调用 unlock 时失效并返回包装类,而不是返回引用,并且您可以重载其赋值运算符以分配给引用。诀窍是您需要挂起对包装器内部数据的引用,以便在调用 unlock 时,在释放锁之前,使您创建的任何包装器无效。

关于c++ - C++ 中的只写引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2695317/

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