auto
применительно к параметрам функции недопустимо в C ++ 11, поэтому ваш вопрос спорный.
C ++ 14 позволяет лямбда функциям использовать auto
в параметрах. Но это достигается созданием лямбда-шаблона operator()
. Так что [](auto val)
эквивалентно template<typename T> void some_func(T val);
. И, как и любой другой экземпляр шаблона, val
не является ссылкой, если T
сам не является ссылочным типом. Правила вывода аргументов шаблона не меняются только потому, что вы использовали auto
, а не явный аргумент шаблона.
То же самое будет, когда / если C ++ 20 формально разрешит auto
работать со всеми функциями. И компиляторы, которые предлагают auto
параметры не-лямбда-выражений в качестве расширения компилятора, делают это точно так же, как и для лямбда-выражений.
Является ли авто достаточно умным, чтобы вывести тип string1 к типу const ref, как этот?
Что по этому поводу будет "умным"? Пользователь не запрашивал параметр const&
, о чем свидетельствует отсутствие const
и отсутствие &
. Если пользователь искренне хочет так называемую «неэффективную» версию (что совершенно правильно), такой код не будет разумным. Действительно, в вашей «умной» версии вы бы не смогли написать функцию, которая взяла бы std::string
по значению.