プロが教える店舗&オフィスのセキュリティ対策術

C++においてexplicitについて調べると

explicit <エクスプリシット>
 「明示的」
 引数をひとつだけ受け取るコンストラクタに付けることのできる C++ 言語のキーワード。
 クラスを関数の引数として使う場合、その関数には、クラスのコンストラクタの引数になっているものも渡すことができてしまう。これは暗黙的にコンストラクタが呼び出されるからである。このとき、「コンストラクタの引数」がまるで「関数の引数」であるかのように振る舞ってしまい、本来ならコンパイルエラーとなって欲しい場面でも、見えない部分でコンストラクタが呼ばれることでコンパイルが通ってしまう。その結果、想定していない動作をする可能性がある。
 そこで、コンストラクタには「暗示的に呼び出せない」ようにするためのキーワードがある。それが explicit である。このキーワードを付けたコンストラクタは、必ず明示的に呼び出される必要があり、前述のようなことをしようとするとコンパイル時にエラーが発生する。

となっていました

「クラスを関数の引数として使う場合、その関数には、クラスのコンストラクタの引数になっているものも渡すことができてしまう。」

のところが分かりません
具体例で説明してください

例えば
template<class CharType,class Attr=char_traits<CharType>,
Class Allocator=allocator<T> >class basic_string
クラスのコンストラクタが
explicit basic_string(const Allocator &a=Allocator());
ですがこのケースについて説明していただければ幸いです

A 回答 (4件)

class A {


public:
A(int);
};

void f(const A&);

int main() {
f(3); // non-explicitであるがためにintからAへの変換が起こる
return 0;
}

この回答への補足

f(3)はf(A(3))を意味するということですか?
これで何かまずい例はありますか?
よろしくお願いします

補足日時:2002/12/20 15:09
    • good
    • 1

> explicit basic_string(const Allocator &a=Allocator());


> ですがこのケースについて説明していただければ幸いです

explicitでないと、Allocatorからbasic_stringへの暗黙の変換が起こってしまうことになります。

std::allocator<char> a;
std::string str = a; // できちゃう

basic_stringの実装者はその変換を望まないのでexplicitにしたのでしょう。
    • good
    • 0

> f(3)はf(A(3))を意味するということですか?



YES

> これで何かまずい例はありますか?

int から A に明示的に変換して欲しくないとき。

class A { public: A(int); };
class B { public: B(int); };

void f(const A&);
void f(const B&);

int main() {
f(3); // エラー:どっちを呼ぶか決定できない
return 0;
}

この回答への補足

A a=b;//(1)

A a(b);//(2)
を意味するのはaとbが厳密に同じA型であるときだけにしていればこのような混乱は発生しなかったのに柔軟性を求めすぎた結果ですね

aとbが厳密に同じ型でなくても(1)と(2)が同じということにすることによるメリットはあるのでしょうか?
basic_string str="moji";
などは
basic_string str("moji");
としないといけないという風にしたからといってそれほど不便はないと思うのですが
むしろexplicitなるキーワードを追加しなくてすみ混乱しなくなりバグも少なくなるような気がします

なにか意見をいただければ幸いです

補足日時:2002/12/20 15:45
    • good
    • 0

他の方の意見がどうであれ、あなたが不要と思うなら使わなければいいだけのことではありませんか?


# 僕もあなたも、言語設計者ではないのだから
    • good
    • 0
この回答へのお礼

できてしまったものは愚痴を言ってもしかたがないですね
ありがとうございました

お礼日時:2002/12/20 16:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!