1

我有以下一段 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&&as 参数,f我希望模板参数解析为object&并且因为& && = &函数f应该成为

void f(object& p) { makeItTalk(std::forward<object&>(p)); }

但是这个函数甚至不允许被调用obj。所以我想知道我说的const被忽略是否错了?

4

1 回答 1

0

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

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

于 2013-06-27T11:51:10.093 回答