次の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、テンプレート推定では修飾子は無視されます。objはタイプconst object&であり、P&&as パラメーターがあるため、テンプレートパラメーターはに解決されるとf予想され、関数は次のようになるはずですobject&& && = &f
void f(object& p) { makeItTalk(std::forward<object&>(p)); }
しかし、この関数は に対して呼び出すことさえ許可されていませんobj。constだから、私は無視されていると言って間違っているのではないかと思っていますか?