5

私はちょうど機能書いた:std :: stringはどのようにこのトリックを管理しますか?

void doSomeStuffWithTheString(const std::string& value) { 
... 
std::string v = value; 
std::cout << value.c_str(); 
... 
} 

をしかし、私は

doSomeStuffWithTheString("foo"); 

でこれを呼び出し、それが動作します。だから、私はこの(std :: stringの暗黙的なインスタンスを初期化するconst char *)を動作すると考えていただろう値が渡される必要がありますが、この場合は(const)参照渡されます。

参照がconstの場合、const char *からインスタンス化された暗黙の一時的なstd :: stringですか?もしそうでなければ、これはどうやって動くのでしょうか?

EDIT機能が1コンパイラを選択します

void doSomeStuffWithTheString(const char* value); 

でオーバーロードされた場合に何が起こるか

+0

あなたはかなりあなた自身の質問に答えました:) – pezcode

+0

興味深い、それを知らなかった。オブジェクトが持つ必要があるのは、そのような暗黙的なコンストラクタがconst-by-ref呼び出しで発生することです(それを回避する方法) – lurscher

+1

プログラムが不正です: 'std :: string = value;'は無効であり、あなたのコンパイラによって拒否されるべきです。 –

答えて

7

std::stringタイプは、暗黙の変換(コンストラクタ経由)がconst char*からです。これは、文字列リテラル"foo"std::stringに変換できるようにするものです。この結果、一時的な値になります。 C++では、const &を一時的な値にすることは合法です。したがって、これはすべて一緒に保持されます。

C++で独自のカスタムタイプを使用してこのトリックを複製することは可能です。

class Example { 
public: 
    Example(const char* pValue) {} 
}; 

void Method(const Example& e) { 
    ... 
} 

Method("foo"); 
0

はい、テンポラリstd::stringは文字列リテラルから構成されます。

0

正確に、std::stringデフォルトコンストラクタ

0

使用して「値は値によって渡されなければならないが、この場合、(CONST)参照によって渡されます。」

がCONST参照(この場合、const std::string &)型の引数に(この場合、一時的std::stringは暗黙const char *から変換された)一時的な値を渡すことが可能となるC++機能があります。