複数の引数explicit
を持つコンストラクターを作成すると、(有用な) 効果がありますか?
例:
class A {
public:
explicit A( int b, int c ); // does explicit have any (useful) effect?
};
複数の引数explicit
を持つコンストラクターを作成すると、(有用な) 効果がありますか?
例:
class A {
public:
explicit A( int b, int c ); // does explicit have any (useful) effect?
};
C++11 までは、ええ、explicit
複数引数のコンストラクターで使用する理由はありません。
C++11 では、イニシャライザ リストにより、これが変更されます。基本的に、初期化子リストを使用したコピー初期化 (ただし、直接初期化ではない) では、コンストラクターがマークされていない必要がありますexplicit
。
例:
struct Foo { Foo(int, int); };
struct Bar { explicit Bar(int, int); };
Foo f1(1, 1); // ok
Foo f2 {1, 1}; // ok
Foo f3 = {1, 1}; // ok
Bar b1(1, 1); // ok
Bar b2 {1, 1}; // ok
Bar b3 = {1, 1}; // NOT OKAY
ブレースの初期化のためにそれを見つけます(たとえば、配列内)
struct A {
explicit A( int b, int c ) {}
};
struct B {
B( int b, int c ) {}
};
int main() {
B b[] = {{1,2}, {3,5}}; // OK
A a1[] = {A{1,2}, A{3,4}}; // OK
A a2[] = {{1,2}, {3,4}}; // Error
return 0;
}
@StoryTeller と @Sneftel による優れた回答が主な理由です。ただし、IMHO、これは理にかなっています (少なくとも私はそうしています)。将来の証明の一部として、後でコードが変更されます。あなたの例を考えてみましょう:
class A {
public:
explicit A( int b, int c );
};
このコードは、 から直接恩恵を受けるわけではありませんexplicit
。
しばらくして、 のデフォルト値を追加することにしたc
ので、次のようになります。
class A {
public:
A( int b, int c=0 );
};
これを行うときは、パラメーターに焦点を当てていc
ます-振り返ってみると、デフォルト値が必要です。A
それ自体を暗黙的に構築する必要があるかどうかに必ずしも焦点を当てているわけではありません。残念ながら、この変更によりexplicit
再び関連性が高まります。
そのため、actor が であることを伝えるexplicit
ために、最初にメソッドを記述するときにそうするのは有料かもしれません。