三項は、明示的なコピーコンストラクターを暗黙的に呼び出すことを許可されていますか?

ナマーク

以下のコードを検討してください。

#include <cstdio>
struct A
{
    A(){}
    explicit A(const A&) {std::puts("copy");}
};

int main() 
{
    A a;
    true ? a : A();
    return 0;
}

私は、三元、コピーしようと理解したようやコピーコンストラクタは、明示的であるため、失敗する必要があり、しかし、gccがこれだけで罰金をコンパイルし、コピーを作成します。Clangは期待どおりにエラーを吐き出します。

これはgccのバグですか?

c ++ 17モードでgcc8.1とclang7.0を使用していますが、c ++ 98モードのコンパイラエクスプローラーすべてのバージョンのgccを試しましたが、すべて同じように動作します。

StoryTeller-Unslander Monica

Clangはそれを拒否する権利があり、それは確かにGCCのバグです。簡単にするために、n4659(C ++ 17標準に最も近いドキュメント)を引用します。

何よりもまず[expr.cond]¶6で指定されている例の条件式の型は、型のprvalueでなければなりませんA

さて、[expr.cond]¶7によると、私の強調:

左辺値から右辺値、配列からポインター、および関数からポインターの標準変換は、2番目と3番目のオペランドで実行されます。

a左辺値から右辺値への変換を実行できる必要があります。[conv.lval]¶3.2(ここでも強調鉱山)で次のようにa指定されているのどれですか

それ以外の場合、Tにクラスタイプがある場合、変換はglvalueから結果オブジェクトをコピー初期化します。

コピーの初期化AからはA、どのようなコンテキストで、オーバーロード解決(に変換コンストラクタを選ぶべきである[over.match.copy]¶1.1):

Tの変換コンストラクターは候補関数です。

また、明示的なコピーコンストラクターは変換コンストラクターではありません([class.conv.ctor]¶3

非明示的なコピー/移動コンストラクタ([class.copy])は変換コンストラクタです。

準拠するC ++実装は、作成した条件式を整形式として受け入れることができません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Unityのエラー(Script Inspector 3):GetBoolをScriptableObjectコンストラクターから呼び出すことは許可されていません

分類Dev

なぜあなたは別の1つのコンストラクタを呼び出すことが許可されていますか?

分類Dev

Javaエラー:暗黙のスーパーコンストラクターが定義されていません。別のコンストラクターを明示的に呼び出す必要があります

分類Dev

クラスのostringstreamタイプのメンバーが、「暗黙的に削除されたコピーコンストラクターの呼び出し」エラーを引き起こすのはなぜですか?

分類Dev

コンストラクター内でthis()を呼び出すと、暗黙的にsuper()が呼び出されるのは本当ですか?

分類Dev

コンストラクターにパイプを渡すことは許可されていますか?

分類Dev

暗黙のスーパーコンストラクターclassA()を解決する方法が表示されません。別のコンストラクターを明示的に呼び出す必要がありますか?

分類Dev

コンストラクタまたはメソッドを呼び出そうとするときに、「this」が暗黙的にパラメータとして渡されるのはなぜですか?

分類Dev

コピーコンストラクター/ oper =のみを定義した場合、ムーブコンストラクター/ムーブ代入が暗黙的に宣言および削除済みとして定義されないのはなぜですか?

分類Dev

コンストラクターが暗黙的に呼び出されているときのstd :: moveの動作は何ですか?

分類Dev

C ++の暗黙的なコピーコンストラクターをインターセプトするか、その機能を呼び出します

分類Dev

明示的なコンストラクターを明示的に呼び出さずにマップを初期化するにはどうすればよいですか?

分類Dev

ミューテックスをメンバー変数として使用するにはどうすればよいですか?'simple_encoder'のコピーコンストラクタがないと暗黙的に削除されます

分類Dev

コンストラクタを呼び出すときに、intが暗黙的にdoubleではなくfloatにキャストされるのですか?

分類Dev

コピーコンストラクターで暗黙的に呼び出すことができないメソッド

分類Dev

コンストラクターで小道具を変更することは「許可されていますか」?

分類Dev

ブレースされたinitリストを使用して明示的なコンストラクターを呼び出す:あいまいかどうか?

分類Dev

コピーの省略がない場合、コピー/移動コンストラクタはデストラクタの前に呼び出されることが保証されていますか?

分類Dev

Java。暗黙的なスーパーコンストラクターEmployee()は未定義です。別のコンストラクターを明示的に呼び出す必要があります

分類Dev

C ++基本クラス/構造体コンストラクターが派生から暗黙的に呼び出すことができる複数の引数を持つことができないのはなぜですか?

分類Dev

暗黙のスーパーコンストラクターPerson()は未定義です。別のコンストラクターを明示的に呼び出す必要がありますか?

分類Dev

C ++でコピーコンストラクターが呼び出されるのはいつですか?オブジェクトを別のオブジェクトに割り当てるときに呼び出されませんか?

分類Dev

mustの1つを明示的にすることにより、あいまいなコンストラクターへのこの呼び出しを解決するにはどうすればよいですか?

分類Dev

オブジェクトをパラメーターとして渡すときに、デストラクタが呼び出されているのにコンストラクションが呼び出されていないのはなぜですか?

分類Dev

この場合、コンストラクターまたは明示的な関数を介したより良い暗黙の変換は何ですか?

分類Dev

パラメータをコピーすると、削除されたコンストラクタが呼び出されるべきでないときにそのコンストラクタが呼び出されます

分類Dev

変換演算子がコピーコンストラクターを呼び出さないようにするにはどうすればよいですか?

分類Dev

なぜコンストラクターは常にクラスと同じ名前を持ち、どのように暗黙的に呼び出されるのですか?

分類Dev

暗黙的に削除されたコピーコンストラクターへのgmock呼び出し

Related 関連記事

  1. 1

    Unityのエラー(Script Inspector 3):GetBoolをScriptableObjectコンストラクターから呼び出すことは許可されていません

  2. 2

    なぜあなたは別の1つのコンストラクタを呼び出すことが許可されていますか?

  3. 3

    Javaエラー:暗黙のスーパーコンストラクターが定義されていません。別のコンストラクターを明示的に呼び出す必要があります

  4. 4

    クラスのostringstreamタイプのメンバーが、「暗黙的に削除されたコピーコンストラクターの呼び出し」エラーを引き起こすのはなぜですか?

  5. 5

    コンストラクター内でthis()を呼び出すと、暗黙的にsuper()が呼び出されるのは本当ですか?

  6. 6

    コンストラクターにパイプを渡すことは許可されていますか?

  7. 7

    暗黙のスーパーコンストラクターclassA()を解決する方法が表示されません。別のコンストラクターを明示的に呼び出す必要がありますか?

  8. 8

    コンストラクタまたはメソッドを呼び出そうとするときに、「this」が暗黙的にパラメータとして渡されるのはなぜですか?

  9. 9

    コピーコンストラクター/ oper =のみを定義した場合、ムーブコンストラクター/ムーブ代入が暗黙的に宣言および削除済みとして定義されないのはなぜですか?

  10. 10

    コンストラクターが暗黙的に呼び出されているときのstd :: moveの動作は何ですか?

  11. 11

    C ++の暗黙的なコピーコンストラクターをインターセプトするか、その機能を呼び出します

  12. 12

    明示的なコンストラクターを明示的に呼び出さずにマップを初期化するにはどうすればよいですか?

  13. 13

    ミューテックスをメンバー変数として使用するにはどうすればよいですか?'simple_encoder'のコピーコンストラクタがないと暗黙的に削除されます

  14. 14

    コンストラクタを呼び出すときに、intが暗黙的にdoubleではなくfloatにキャストされるのですか?

  15. 15

    コピーコンストラクターで暗黙的に呼び出すことができないメソッド

  16. 16

    コンストラクターで小道具を変更することは「許可されていますか」?

  17. 17

    ブレースされたinitリストを使用して明示的なコンストラクターを呼び出す:あいまいかどうか?

  18. 18

    コピーの省略がない場合、コピー/移動コンストラクタはデストラクタの前に呼び出されることが保証されていますか?

  19. 19

    Java。暗黙的なスーパーコンストラクターEmployee()は未定義です。別のコンストラクターを明示的に呼び出す必要があります

  20. 20

    C ++基本クラス/構造体コンストラクターが派生から暗黙的に呼び出すことができる複数の引数を持つことができないのはなぜですか?

  21. 21

    暗黙のスーパーコンストラクターPerson()は未定義です。別のコンストラクターを明示的に呼び出す必要がありますか?

  22. 22

    C ++でコピーコンストラクターが呼び出されるのはいつですか?オブジェクトを別のオブジェクトに割り当てるときに呼び出されませんか?

  23. 23

    mustの1つを明示的にすることにより、あいまいなコンストラクターへのこの呼び出しを解決するにはどうすればよいですか?

  24. 24

    オブジェクトをパラメーターとして渡すときに、デストラクタが呼び出されているのにコンストラクションが呼び出されていないのはなぜですか?

  25. 25

    この場合、コンストラクターまたは明示的な関数を介したより良い暗黙の変換は何ですか?

  26. 26

    パラメータをコピーすると、削除されたコンストラクタが呼び出されるべきでないときにそのコンストラクタが呼び出されます

  27. 27

    変換演算子がコピーコンストラクターを呼び出さないようにするにはどうすればよいですか?

  28. 28

    なぜコンストラクターは常にクラスと同じ名前を持ち、どのように暗黙的に呼び出されるのですか?

  29. 29

    暗黙的に削除されたコピーコンストラクターへのgmock呼び出し

ホットタグ

アーカイブ