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、テンプレート推定では修飾子は無視されます。objはタイプconst object&であり、P&&as パラメーターがあるため、テンプレートパラメーターはに解決されるとf予想され、関数は次のようになるはずですobject&& && = &f

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

しかし、この関数は に対して呼び出すことさえ許可されていませんobjconstだから、私は無視されていると言って間違っているのではないかと思っていますか?

4

1 に答える 1

0

私が理解しているように、関数テンプレートがポインターまたは参照パラメーターを取る場合、型推定は const 修飾子を無視しません。最上位の const は削除されますが、ポイントまたは参照される内容の constness は削除されません。

より広範な議論がここにあります: http://cpp-next.com/archive/2011/04/appearing-and-disappearing-consts-in-c/

于 2013-06-27T11:51:10.093 に答える