У меня есть следующий кусок кода C ++ 11:
#include <iostream>
struct object {
void talk(const char* text) const { std::cout << "talk " << text << std::endl; }
};
void makeItTalk(object& obj) { obj.talk("non-const"); }
void makeItTalk(const object& obj) { obj.talk("const"); }
template<typename P> void f(P&& p) {
makeItTalk(std::forward<P>(p));
}int main() {
const object obj;
f(obj);
return 0;
}
При беге получаю talk const
что это должно быть, но мне интересно, как это работает. Из того, что я прочитал до сих пор const
-qualifier игнорируется при выводе шаблона. поскольку obj
имеет тип const object&
и у нас есть P&&
в качестве параметра в f
Я ожидаю, что параметр шаблона разрешается в object&
и с тех пор & && = &
функция f
должен стать
void f(object& p) { makeItTalk(std::forward<object&>(p)); }
Но эта функция даже не может быть вызвана для obj
, Так что мне интересно, если я не прав, говоря const
игнорируется?
Насколько я понимаю, дедукция типа не игнорирует спецификатор const, когда шаблон функции принимает указатель или ссылочный параметр. Констант верхнего уровня удаляются, но не совпадают с тем, на что указывают или на которые ссылаются.
Более обширный аргумент можно найти здесь: http://cpp-next.com/archive/2011/04/appearing-and-disappearing-consts-in-c/
Других решений пока нет …