模板化函数和const限定符中的类型推导

时间:2013-06-27 10:34:13

标签: c++ templates type-deduction

我有以下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被忽略了?

1 个答案:

答案 0 :(得分:0)

据我了解,当函数模板采用指针或引用参数时,类型推导不会忽略const限定符。顶级的consts被删除,但不是指向或引用的常量。

可以在此处找到更广泛的论点:http://cpp-next.com/archive/2011/04/appearing-and-disappearing-consts-in-c/