2

ということをずっと教えられてきました

1. Class c(arg);

2. Class c = arg;

は 2 つの完全に同等のステートメントですが、この状況を見てください。

#include <iostream>

class Intermediary {
};

class Left {
  public:
    Left(const Intermediary &) {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }   
};

class Right {
  public:
    // The argument is there just so that the example can work, see below
    Right(int) { 
        std::cout << __PRETTY_FUNCTION__  << std::endl;
    }

    operator Intermediary () const {
        std::cout << __PRETTY_FUNCTION__  << std::endl;

        return Intermediary();    
    }
};

今私がこれを行うと:

Left l = Right(0);

コンパイラは文句を言います

error: conversion from Right to non-scalar type Left requested

しかし、私がこれを行うと:

Left l(Right(0)); 

次に、すべてがコンパイルされ、出力は

Right::Right(int)
Right::operator Intermediary() const
Left::Left(const Intermediary&)

ただし、これを行うと:

Left l = (Intermediary)Right(0);

その後、すべてが再びコンパイルされ、出力は上記のようになります。

だから明らかに

1. Class c(arg);

2. Class c = arg;

は同じではありませんが、なぜ違うのでしょうか?違いは何ですか? これについてはオンラインで何も見つかりませんでした。

4

1 に答える 1

5

私は常にClass c(arg);Class c = arg;は 2 つの完全に同等のステートメントであると教えられてきましたが、この状況を見てください。

それらは同等ではないことがわかりました。最初のものは から を構築Class carg、2 番目のものはClassから を構築しarg、それからコピー構築Class cします。実装はそのコピーを削除することが許可されており、通常は削除されていることに注意してください。

Left l = Right(0);

これには、 から への変換と、 から への変換が必要Rightです。この 2 つの連続したユーザー定義の変換は、標準では許可されていません。次のように、少なくとも 1 つを明示的に行う必要があります。IntermediaryIntermediaryLeft

Left l = (Intermediary)Right(0);
于 2011-10-29T00:51:38.680 に答える