Почему as_const запрещает аргументы?

c++ rvalue c++17

576 просмотра

3 ответа

Я хотел спросить, почему as_constзапрещает аргументы rvalue, в соответствии с cppreference.com (то есть, почему люди по Стандартам сделали это, а не почему cppreference.com специально цитировал их по этому поводу. И также не там, где в спецификации кодифицировано намерение комитета, просто для уверенности :))). Этот (искусственный) пример может привести к ошибке (пользователь хочет сделать так, чтобы COW молчал)

QChar c = as_const(getQString())[0];

В ответе на другой вопрос отмечается, что, если мы просто удалим удаление перегруженной ссылки на rvalue, она бесшумно преобразует rvalue в lvalue. Правильно, но почему бы не обработать rvalues ​​изящно и вернуть const rvalues ​​для ввода rvalue и const lvalues ​​для ввода lvalue?

Автор: Johannes Schaub - litb Источник Размещён: 08.11.2019 10:59

Ответы (3)


5 плюса

Решение

Одной из причин может быть то, что это может быть опасно для стоимости из-за отсутствия передачи права собственности

for (auto const &&value : as_const(getQString()))  // whoops!
{
}

и что не может быть убедительного варианта использования, оправдывающего игнорирование этой возможности.

Автор: Mehrdad Размещён: 20.08.2016 07:23

6 плюса

Проблема заключается в том, чтобы справиться с продлением жизни

const auto& s = as_const(getQString()); // Create dangling pointer
QChar c = s[0]; // UB :-/

Возможна следующая перегрузка (вместо удаленной)

template< typename T >
const T as_const(T&& t) noexcept(noexcept(T(t)))
{
    return t;
}

который включает в себя дополнительное строительство, и, возможно, другие подводные камни.

Автор: Jarod42 Размещён: 20.08.2016 07:47

-2 плюса

Потому что as_const не принимает аргумент как константную ссылку. Неконстантные ссылки на lvalue не могут привязываться к временным файлам.

Перегрузка ссылочной пересылки явно удалена.

Автор: user2393256 Размещён: 20.08.2016 07:25
Вопросы из категории :
32x32