第一个临时任务(1)是否无效(嗯,除了声明一个类型)?我认为第二项任务只是覆盖了key_record
的临时指针。
void store_key( const key_data& key )
{
owallet_key_record key_record = ...
key_data& temp = *key_record; // 1
temp = key;
}
编辑:参考,https://github.com/BitShares/bitshares/blob/v0.4.28-dev1/libraries/wallet/wallet_db.cpp#L555-L556
注意,temp
不再使用。此外,这种技术在文件中以相同的模式多次使用,因此必须是有意的。
答案 0 :(得分:2)
您的想法是正确的,但我不会将参考声明描述为“无用”。
根据store_key()方法中的其他内容,这种引用声明通常用于清晰,并且可能使引用对象的频繁使用更加清晰和可读。
即使没有,也应该将代码优化留给编译器。如果临时引用导致更清晰,更易于理解的代码,那么这就足够了。让编译器担心优化掉不需要的临时工。
答案 1 :(得分:1)
在回答时,owallet_key_record
的定义不可用。说实话,我并不关心它的定义是什么,因为你的问题实际上是在寻求一个假设的情况,这个“习语”可能有意义。如果你想知道为什么它对这个特定的源代码有意义,那么这对你来说不是正确的答案(但对其他人来说仍然有用)。
可能是类型*owallet_key_record
导致一个类型定义了自己的赋值运算符,但是有一个转换运算符为key_data &
。
所以,例如:
struct owallet_key_record {
key_data k;
struct deref {
owallet_key_record *r;
~deref () { r->release(); }
deref (owallet_key_record *x) : r(x) { r->acquire(); }
deref (const deref &d) : r(d.r) { r->acquire(); }
deref & operator = (deref d) { std::swap(r, d.r); return *this; }
operator key_data & () { return r->key(); }
};
deref operator * () { return this; }
key_data & key () { return k; }
void acquire () {}
void release () {}
};
然后以下将失败:
owallet_key_record key_record /*= ...*/;
*key_record = key;
答案 2 :(得分:1)
你错了。第一个"任务"实际上不是一项任务。它初始化了一个引用。
无法重新初始化参考。第二个=
是真正的作业。它更改*key_record
,即temp
引用的对象。
但是,一位称职的C ++程序员只会编写*key_record = key
。该引用只是命名*key_record
的结果,而temp
根本不是一个有用的名称。