次の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
だから、私は無視されていると言って間違っているのではないかと思っていますか?