2015-01-08 7 views
0

Является ли первое назначение temp (1) бесполезным (ну, кроме объявления типа)? Я думаю, что второе назначение - это просто переписывание указателя temp на key_record.Простой пояснение указателя/указателя на C++

void store_key(const key_data& key) 
    { 
     owallet_key_record key_record = ... 
     key_data& temp = *key_record; // 1 
     temp = key; 
    } 

EDIT: ссылки, https://github.com/BitShares/bitshares/blob/v0.4.28-dev1/libraries/wallet/wallet_db.cpp#L555-L556

Обратите внимание, temp снова не используется. Кроме того, этот метод используется несколько раз в файле в этом же шаблоне, поэтому он должен быть преднамеренным.

ответ

2

Ваши мысли верны, но я бы не характеризовал декларацию ссылок как «бесполезную».

В зависимости от того, что еще происходит в методе store_key(), этот тип ссылочного объявления часто используется для ясности и, возможно, для частого использования ссылочного объекта более понятным и читаемым.

И даже если нет, вы должны оставить оптимизацию кода для компилятора. Если временная ссылка приводит к более понятному, понятному коду, это вполне разумная причина сама по себе. Пусть компилятор беспокоится об оптимизации ненужных временных рядов.

+0

Как литой? 'key_data & key' также является допустимым' owallet_key_record' – jcalfee314

+0

. Разработчик BitShares подтверждает: «он унаследован, поэтому требуется явное приведение» и «нужно явно передать его через» (key_data &) * key_record = key "". – jcalfee314

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; 
1

Вы ошибаетесь. Первое «назначение» на самом деле не является заданием. Он инициализирует ссылку.

Ссылки не могут быть повторно инициализированы. Второе = - настоящее задание. Он изменяет *key_record, объект, на который ссылается temp.

Компетентный программист на С ++ просто напишет *key_record = key. Ссылка только называет результат *key_record, а temp не является полезным именем вообще.

+0

Это имеет смысл .. поверьте мне, они очень компетентны, просто заняты;) – jcalfee314

Смежные вопросы