Запрос некоторой помощи, чтобы понять вывод типа ссылки на 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.
Итак, вот мои вопросы:
- Что компилятор делает с шаблонамиверсия для принятия rvalue?
- Исправление
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 *]