19

ここによると、explicit

暗黙的な変換またはコピー初期化を許可しないコンストラクターと変換演算子 (C++11 以降) を指定します。

したがって、これらの 2 つの手法は同一ですか?

struct Z {
        // ...
        Z(long long);     // can initialize with a long long
        Z(long) = delete; // but not anything smaller
};

struct Z {
        // ...
        explicit Z(long long);     // can initialize ONLY with a long long
};
4

5 に答える 5

6

explicitあなたの型への暗黙的な変換をブロックします。

あなたのテクニックは、 からへの=delete暗黙的な変換をブロックします。longlong long

これらはほとんど無関係です。

違いを示す 4 つのケースがあります。

Z z = 1L;
Z z = 1LL;

longからおよびlong longへの暗黙的な変換Zです。

Z z = Z(1L);
Z z = Z(1LL);

longからおよびlong longへの明示的な変換Zです。

explicit Z(long long)ブロック:

Z z = 1L;
Z z = 1LL;

whileZ(long)=deleteブロック:

Z z = 1L;
Z z = Z(1L);

explicit Z(long long)からへZ z = Z(1L)の変換は暗黙的ですが、後で行われるへの明示的な変換とは無関係であるため、許可されます。longlong longZ

と の混合は、4 つのバージョン間でのみ有効であることに注意しexplicitてください=deleteZ z=Z(1LL)

(上記は、有効なコピーまたは移動 ctor を前提としています。そうでない場合は、置き換えZ z=Z(...)Z z(...)同じ結論が得られます)。

于 2016-04-19T15:19:15.723 に答える
2
struct Zb {
        Zb(long long)
        {};     // can initialize with a long long
        Zb(long) = delete; // but not anything smaller
    };

struct Za {
        // ...
        explicit Za(long long)
        {};     // can initialize ONLY with a long long
    };

int main()
{
    Za((long long)10);  // works
    Za((long)10);       // works    

    Zb((long long)10);  // works
    Zb((long)10);       // does not work

    return 0;
}

あなたの例では、明示的な削除が必要です。

ライブ: http://cpp.sh/4sqb

于 2016-04-19T15:05:18.567 に答える