जब तक कि मैं गलत नहीं हूं ऐसा लगता है कि या तो ठीक काम करता है - क्या एक दूसरे को पसंद करने का सबसे अच्छा अभ्यास कारण है?क्या मुझे cdors/असाइनमेंट ऑपरेटरों में std :: move या std :: आगे का उपयोग करना चाहिए?
उदाहरण:
struct A
{
A(){}
A(const A&){ std::cout << "A(const A&)\n"; }
A(A&&){ std::cout << "A(A&&)\n"; }
};
struct B
{
B(){}
B(const B& right) : x(right.x){ std::cout << "B(const B&)\n"; }
B(B&& right) : x(std::forward<A>(right.x)){ std::cout << "B(B&&)\n"; }
A x;
};
struct C
{
C(){}
C(const C& right) : x(right.x){ std::cout << "C(const C&)\n"; }
C(C&& right) : x(std::move(right.x)){ std::cout << "C(C&&)\n"; }
A x;
};
struct D
{
D(){}
D(const D& right) : x(right.x){ std::cout << "D(const D&)\n"; }
D(D&& right) : x(right.x){ std::cout << "D(D&&)\n"; }
A x;
};
int main()
{
std::cout << "--- B Test ---\n";
B b1;
B b2(std::move(b1));
std::cout << "--- C Test ---\n";
C c1;
C c2(std::move(c1));
std::cout << "--- D Test ---\n";
D d1;
D d2(std::move(d1));
}
आउटपुट:
--- B Test ---
A(A&&)
B(B&&)
--- C Test ---
A(A&&)
C(C&&)
--- D Test ---
A(const A&)
D(D&&)
आप सही हैं, मैं गलत ctor देख रहा था। मैंने प्रश्न में कुछ उदाहरण कोड जोड़ा। – David
@ डेव: 'std :: forward' का आपका उपयोग गलत है, क्योंकि 'ए' एक समर्पित टेम्पलेट पैरामीटर नहीं है। ऐसा लगता है कि यह 'std :: forward' के "rvalue" संस्करण से मेल खाता है। – Xeo
मैं आपकी शब्दावली पूरी तरह से समझ नहीं पा रहा हूं, लेकिन आगे बढ़ता नहीं है (और यह हमेशा * नहीं *) एक ही चीज को हल कर सकता है जैसे std :: move ctor (rvalue to cast) में स्थानांतरित करें? साइड नोट: वीएस -2010 लगता है (गलत तरीके से?) # 1 मौजूद नहीं होने पर आपके ऑपरेटर # 2 को चालक ctor के रूप में स्वीकार करते हैं। – David