Вывод типа в шаблонных функциях и const quailifier

У меня есть следующий кусок кода 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 игнорируется?

1

Решение

Насколько я понимаю, дедукция типа не игнорирует спецификатор const, когда шаблон функции принимает указатель или ссылочный параметр. Констант верхнего уровня удаляются, но не совпадают с тем, на что указывают или на которые ссылаются.

Более обширный аргумент можно найти здесь: http://cpp-next.com/archive/2011/04/appearing-and-disappearing-consts-in-c/

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]