我有以下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&&
中有一个f
参数,我希望模板参数可以解析为object&
,因为{{1}函数& && = &
应该成为
f
但是void f(object& p) { makeItTalk(std::forward<object&>(p)); }
甚至不允许调用此函数。所以我想知道我是否错了,说obj
被忽略了?
答案 0 :(得分:0)
据我了解,当函数模板采用指针或引用参数时,类型推导不会忽略const限定符。顶级的consts被删除,但不是指向或引用的常量。
可以在此处找到更广泛的论点:http://cpp-next.com/archive/2011/04/appearing-and-disappearing-consts-in-c/