Почему const auto не работает с конечным типом возвращаемого значения? (Ошибка C3551 в Visual Studio)

#c

#c

Вопрос:

Описание кода ошибки:

если используется конечный тип возвращаемого значения, то ведущим типом возвращаемого значения должен быть единственный спецификатор типа ‘auto’ (не ‘const auto’)

В принципе, этот фрагмент кода не работает:

 const auto begin() const -> decltype(_data.begin()) { return _data.begin(); }
  

Могу ли я, пожалуйста, узнать, почему это не работает? Я использую MSVC 2019, Visual Studio 2019. Спасибо!

Комментарии:

1. Это не работает из-за того, что говорится в ошибке… если вы хотите вернуть const экземпляр итератора, затем поместите const с остальной частью конечного типа возвращаемого значения, т. Е. в завершающем бите , после -> (не имеет значения, находится ли const до или после типа, как обычно). Но я не знаю, есть ли в этом смысл: большинство людей не утруждают себя такой защитой, чтобы возвращать const объекты сейчас AFAICT.

2. Вам интересно, почему в спецификации C говорится, что const auto это не работает? Или как исправить сообщение об ошибке, которое вы получаете?

3. @underscore_d Я пробовал это так, но ошибка сохраняется: const auto begin() ->const decltype(_data.begin()) { return _data.begin(); }

4. @Someprogrammerdude Меня беспокоит последнее, поскольку код был извлечен из предположительно рабочего пакета. Спасибо за разъяснение

5. @LeStarfish Я имел в виду переместить const с начала на после -> , а не копировать его.

Ответ №1:

В функции, где тип возвращаемого значения указан после параметров, auto не является спецификатором типа. Это просто токен, который сообщает анализатору начать разбор функции (своего рода).

Однако const auto является заполнителем типа для возвращаемого типа функции. То есть, если вы начинаете объявление функции с const auto , вы уже указали, что тип возвращаемого значения будет выведен. Таким образом, вы не можете указать тип возвращаемого значения после параметров.

Поэтому поместите const с фактическим типом возвращаемого значения, а не в начале.

Комментарии:

1. Спасибо. Я отметил это как ответ, поскольку это убедило меня не использовать конечный тип возвращаемого значения. Мне понадобилось 2 версии функции (1 с const и 1 без).