2016-07-04 2 views
21

Я всегда думал, что это хорошо, чтобы иметь константные местные быть константнойИзбегайте постоянных местных жителей, которые возвращаются?

void f() { 
    const resource_ptr p = get(); 
    // ... 
} 

Однако на прошлой неделе я наблюдал студентов, которые работали на C++ упражнения и что удивило, константный указатель возвращается

resource_ptr f() { 
    const resource_ptr p = get(); 
    // ... 
    return p; 
} 

Здесь , если компилятор не может применить NRVO (представьте себе какой-то сценарий, под которым это правда, возможно, возвращая один из двух указателей, в зависимости от состояния), внезапно const становится пессимизацией, потому что компилятор не может перемещаться с p, потому что это Уст.

Это хорошая идея, чтобы попытаться избежать const на возвращенных местных жителей, или есть лучший способ справиться с этим?

+0

Не может ли он двигаться из локального 'const' в любом случае с помощью правила as-if? –

+0

На практике, составители, как правило, плохо относятся к применению (N) RVO в любых, но самых тривиальных обстоятельствах, поэтому это является разумной проблемой. Частным случаем является то, что ваша «локальная переменная» на самом деле является аргументом, когда копия эликсирования печально запрещена. –

+0

Не должен ли компилятор определить, что время жизни 'p' закончится и переместится? – Pixelchemist

ответ

15

Полезно ли попытаться избежать const на возвращенных местных жителей или есть лучший способ справиться с этим?

Да. В самом деле, если resource_ptr является только для перемещения, вы получите ошибку времени компиляции, если попытаетесь вернуть тот, который равен const.

Это пример того, как «проверенные и правильные» рекомендации C++ 98/03 больше не применяются в C++ 11 и forward.

+1

Есть ли случаи, когда обязательный elision (C++ 17) меняет вещи здесь? –

+1

@MarcGlisse: Я все еще изучаю новые правила C++ 17. Но мое нынешнее понимание заключается в том, что обязательное исключение будет применяться только к случаю, когда возвращается неназванное временное. Например: 'return X {};'. –

+0

@HowardHinnant было бы правилом, которое делает 'p' const до утверждения' return' не лучшим, если нет других ссылок на 'p' после' return' (dtors locals, объявленных после 'p')? Возврат будет игнорировать 'const'. Мне не нравятся эти «подводные камни», которые ждут вас от каждой другой строки кода. –

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