100

複数の引数explicitを持つコンストラクターを作成すると、(有用な) 効果がありますか?

例:

class A {
    public:
        explicit A( int b, int c ); // does explicit have any (useful) effect?
};
4

4 に答える 4

134

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
于 2016-08-24T11:35:37.803 に答える
34

ブレースの初期化のためにそれを見つけます(たとえば、配列内)

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;
}
于 2016-08-24T11:34:00.897 に答える
25

@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ために、最初にメソッドを記述するときにそうするのは有料かもしれません。

于 2016-08-24T11:40:24.887 に答える