C ++ COPY-CTOR operator=()が使用されているとき - まさにこれはどのように機能しますか?

StackOverflow https://stackoverflow.com//questions/23025259

質問

operator=()割り当てを建設に変換するためのC ++の規則は正確に何ですか?Foo foo = barなど、実際にはFooのコンストラクターを引数としてaccepting barを呼び出します。私はこれがどのように機能するかについての目になりましたが、何も見つけることはできません。

私は、以下の課題がコンストラクタを取り入れようとしているが明らかに正しいものを取り入れようとしていない理由を見つけています:handleptr(タイプとリソース)。実際の建設構文を使用した構造は問題なく機能しますが、代入演算子ではありません。

コード(明らかに簡潔に編集した):

template< typename TYPE >
class HandlePtr {
public:
    HandlePtr( void ) = default;
    HandlePtr( HandlePtr< TYPE >& other ) = default;
    HandlePtr( TYPE& resource ) {} // generally I would make this explicit, but for testing purposes I took it out
    ~HandlePtr( void ) = default;

public:
    HandlePtr<TYPE>& operator=( TYPE& resource ) { return *this; }
    HandlePtr<TYPE>& operator=( HandlePtr<TYPE>& other ) { return *this; }
};

int main ( void ) {
    int x = 5;
    HandlePtr< int > g( x ); // works
    HandlePtr< int > i;i = x; // works
    HandlePtr< int > h = x; // doesn't work

            // also tried this just out of curiosity:
    HandlePtr< int > h = HandlePtr< int >( x ); // also does not work

    return 0;
}
.

エラー:

shit.cpp: In function ‘int main()’:
try.cpp:19:24: error: no matching function for call to ‘HandlePtr<int>::HandlePtr(HandlePtr<int>)’
   HandlePtr< int > h = x; // doesn't work
                        ^
try.cpp:19:24: note: candidates are:
try.cpp:7:3: note: HandlePtr<TYPE>::HandlePtr(TYPE&) [with TYPE = int]
   HandlePtr( TYPE& resource ) {} // generally I would make this explicit, but for testing purposes I took it out
   ^
try.cpp:7:3: note:   no known conversion for argument 1 from ‘HandlePtr<int>’ to ‘int&’
try.cpp:6:3: note: HandlePtr<TYPE>::HandlePtr(HandlePtr<TYPE>&) [with TYPE = int]
   HandlePtr( HandlePtr< TYPE >& other ) = default;
   ^
try.cpp:6:3: note:   no known conversion for argument 1 from ‘HandlePtr<int>’ to ‘HandlePtr<int>&’
try.cpp:5:3: note: HandlePtr<TYPE>::HandlePtr() [with TYPE = int]
   HandlePtr( void ) = default;
   ^
try.cpp:5:3: note:   candidate expects 0 arguments, 1 provided
try.cpp:20:20: error: redeclaration of ‘HandlePtr<int> h’
   HandlePtr< int > h = HandlePtr< int >( x ); // also does not work
                    ^
try.cpp:19:20: error: ‘HandlePtr<int> h’ previously declared here
   HandlePtr< int > h = x; // doesn't work
.

役に立ちましたか?

解決

宣言

で見下ろす
T t = u;
.

これは割り当て演算子ではありません。 t = u;は宣言の副式ではありません。ここでの唯一の式はuです。また、Expression uを評価した結果は、宣言されているオブジェクトtのイニシャイザとして使用されます。

u型の型にある場合は、Ttからコピー構築されています。

uの型がuにない場合、Tは最初にuの型に変換する必要があります。これにより、Type T rvalue が作成されます。

rvalue、soTを受け入れるコンストラクタもありません。また、同一のT t = u;はどちらも失敗します。ただし、rvalueが作成されていないため、T t = T(u);は成功します。値T t(u)は、コンストラクタuの引数として使用されます。

簡易コード例:

struct T
{
    T(int &);
    T(T&);
    T();
    T &operator=(int &);
};

int main()
{
    int x = 5;
    T g(x);   // OK, T(int &)
    T g2(5);   // fail, looks for T(int const &)
    T i;      // OK, T()
    i = x;    // OK, T::operator=(int&)
    T h3 = i; // OK, T(T&)
    T h1 = T(x);    // fail, looks for T(T const &)
    T h2 = x;       // fail, identical to previous line 
}
.

通常、Copy-ConstructorsとAssignment演算子のパラメータとしてT(U &)を使用する必要があります。その後、rvalueをconst参照にバインドできます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top