7

次のコードはエラーを生成するはずだと思います:

#include <iostream>
#include <string>

static void pr(const std::string &aStr)
{
    std::cout << aStr << "\n";
}

int main(void)
{
    const char *a = "Hellu";

    pr(a);

    return 0;
}

しかし、gcc 4.1.2 では正常にコンパイルされます。

std::string のコンストラクターが邪魔になり、std::string のインスタンスを作成するということですか?

参照は単に変数へのエイリアスであるため、そうすべきではないと思います(この場合、参照が参照している std::string 型の変数はありません)。

コードが正常にコンパイルされる理由を説明する人はいますか?

前もって感謝します。

4

2 に答える 2

12

はい、定数への参照が与えられた場合、コンパイラは一時的なもの(この場合は type std::string)を合成し、参照をその一時的なものにバインドできます/合成します。

ただし、参照が const オブジェクトへの参照ではない場合、それは機能しません。そのような一時オブジェクトにバインドできるのは const への参照のみです (ただし、少なくとも広く使用されているコンパイラでは、非 const 参照を参照にバインドできます)。同じように)。

于 2012-07-02T06:59:50.043 に答える
3

遭遇するのは暗黙の変換です。

これは C++ 標準 (SC22-N-4411.pdf) からの引用です。

1 クラス オブジェクトの型変換は、コンストラクタおよび変換関数によって指定できます。これらの変換はユーザー定義の変換と呼ばれ、暗黙的な型変換 (条項 4)、初期化 (8.5)、および明示的な型変換 (5.4、5.2.9) に使用されます。

したがって、コンパイラは意図したとおりに機能し、std::string言及したコンストラクターを呼び出します。

于 2012-07-02T07:03:34.087 に答える