21

foo次のように定義された 2 つのコンストラクターを持つクラスを考えてみましょう。

class foo
{
public:
    foo(const std::string& filename) {std::cout << "ctor 1" << std::endl;}
    foo(const bool some_flag = false) {std::cout << "ctor 2" << std::endl;}
};

文字列リテラルを使用してクラスをインスタンス化し、どのコンストラクターが呼び出されるかを推測しますか?

foo a ("/path/to/file");

出力:

セクター2

私はあなたのことを知りませんが、プログラミングの歴史の中で最も直感的な動作だとは思いません. それには何か賢い理由があるに違いないのですが、それが何であるかを知りたいですか?

4

3 に答える 3

15

これを書くのはCで非常に一般的です

void f(T* ptr) {
    if (ptr) {
        // ptr is not NULL
    }
}

const char*コンストラクタを作成する必要があります。

于 2010-11-06T02:09:07.010 に答える
5

char* を foo コンストラクターに渡しています。これは、ブール値 (すべてのポインターと同様) または std::string に暗黙的に変換できます。コンパイラの観点からは、最初の変換は 2 番目の変換よりも「近い」ものです。これは、ユーザーが提供する変換 (std::string(char*) コンストラクター) よりも標準の変換 (bool へのポインター) が優先されるためです。

于 2010-11-06T02:13:42.773 に答える
-1

あなたは2つの問題を混同しています。1 つは"blah"暗黙的に a に変換できるものでstring、もう 1 つは暗黙const char*的にブール値に変換できるものです。コンパイラが必要な変換の合計量を最小限に抑える暗黙的な変換に移行するのは非常に論理的です。

于 2010-11-06T02:12:57.287 に答える