В C ++ / 11 автоматическое ключевое слово выводит параметры для передачи по ссылке, когда это более эффективно, или всегда передача по значению? - PullRequest
0 голосов
/ 08 сентября 2018

Я хотел бы знать, достаточно ли у C ++ 'auto' для передачи по ссылке для параметров [in]. Например:

   void PrintString(auto string1)
    {
        std::string msg;
        msg = string1 + "\n";
        printf("%s\n", msg.c_str());
    }

Является ли авто достаточно умным, чтобы вывести тип string1 к типу const ref, как этот?

void PrintString(const std::string &string1)

или это просто приводит к неэффективной передаче по значению?

void PrintString(std::string string1)

1 Ответ

0 голосов
/ 08 сентября 2018

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 по значению.

...