Вывод типа для значений в шаблонах - PullRequest
0 голосов
/ 25 декабря 2018

Запрос некоторой помощи, чтобы понять вывод типа ссылки на rvalue.Версия без шаблонов завершается ошибкой со следующей ошибкой, и я понимаю причину.

ошибка: невозможно связать неконстантную ссылку lvalue типа 'const char * &' с rvalue типа 'const char* '

В C ++ 11, если я изменяю функцию void Firstfun(const Key& key) на void Firstfun(const Key&& key), она компилируется, однако шаблонная версия отлично работает с опорным параметром lvalue.

Что касается шаблонной версии, я подумал, что компилятор должен сгенерировать функцию со ссылкой на rvalue, поэтому проверил ее с помощью __PRETTY_FUNCTION__, но не увидел ее в выводе PRETTY_FUNCTION.

Я пришелчерез это обсуждение, где @Anirban упомянул что-то в этих строках.

Для оболочки (A ()); параметр типа T все равно будет выведен как A, а параметру вас будет тип A &&, называемый rvalue ссылкой на A.

Итак, вот мои вопросы:

  1. Что компилятор делает с шаблонамиверсия для принятия rvalue?
  2. Исправление void Firstfun(const Key&& key) для версии без шаблонов, это допустимо и приемлемо?

Версия без шаблона

#include <iostream>

namespace somens {

class Firstclass {
public:

    void Firstfun(const char*& key) {
        std::cout << __PRETTY_FUNCTION__ << '\n';
    }
};

class Secondclass {
    Firstclass f_class;

    char* create_buf(){
        char * buf = new char[10]; //buf will be freed elsewhere.
        return buf;
    }

public:
    void Secondfun (){
        f_class.Firstfun(create_buf());
    }

};
}

int main () {
  somens::Secondclass s_class;
  s_class.Secondfun();

}

Выход из версии без шаблона

Ошибка: невозможно связать неконстантноеСсылка lvalue типа 'const char * &' на rvalue типа 'const char *'

Шаблонная версия

#include <iostream>

namespace somens {
template<typename Key>
class Firstclass {
public:

    void Firstfun(const Key&  key) {
        std::cout << __PRETTY_FUNCTION__ << '\n';
    }
};

class Secondclass {
    Firstclass<const char*> f_class;

    char* create_buf(){
        char * buf = new char[10]; //buf will be freed elsewhere.
        return buf;
    }

public:
    void Secondfun (){
        f_class.Firstfun(create_buf());
    }

};
}

int main () {
  somens::Secondclass s_class;
  s_class.Secondfun();

}

Вывод из шаблонной версии

void somens :: Firstclass :: Firstfun (const Key &) [with Key = const char *]

1 Ответ

0 голосов
/ 25 декабря 2018

Ключевое различие между вашими двумя фрагментами состоит в том, что первый занимает const char*&, а второй - const Key& (он же Key const&), где Key равен const char*.

.в последнем случае это дает вам const char* const&, который (как и любая другая lvalue-ссылка на const) может связываться с временным.

Помните, что const в const char* не имеет значения, так какописывает указателя, а не указатель.

Вам не нужны шаблоны.Вы могли заметить это просто написав using Key = const char*.

...