ऐसा लगता है कि यह पहले से ही सबसे अधिक प्रचलित प्रश्न है।std :: move vs std :: आगे
Whats the difference between std::move and std::forward
लेकिन हर सवाल का जवाब अलग है और लागू होता है और थोड़ा अलग बातें कहते हैं। तो मैं उलझन में हूँ।
मेरे पास निम्न स्थिति है। कंटेनर
कॉपी मद में
- कॉपी आइटम सी ++ 03 तो मैं बहुत अच्छी तरह से समझते हैं कि है। कंटेनर
- निर्माण आइटम सही रूप से सही अग्रेषण का उपयोग करता
emplaceBackInternal()
में टी के निर्माता के लिए दो कार्य के माध्यम से तर्क अग्रेषित करने के लिए (कृपया अन्यथा कहना है कि अगर मैं गलत हूँ)। - आइटम को कंटेनर में ले जाएं
मेरी समस्या कंटेनर में किसी आइटम को स्थानांतरित करने की समझ में प्रतीत होती है।
कंटेनर में निर्माण मद में मेरा मानना है कि
कोड:
template<typename T>
class Container
{
std::size_t length;
T* buffer;
public:
void push_back(T const& value)
{
resizeIfRequired();
pushBackInternal(value);
}
template<typename... Args>
void emplace_back(Args&&... args)
{
resizeIfRequired();
emplaceBackInternal(std::forward<T>(arg)...);
}
void push_back(T&& value)
{
resizeIfRequired();
// Is this forward correct or should it be move
moveBackInternal(std::forward<T>(value));
}
private:
void pushBackInternal(T const& value)
{
// Copy construct object into buffer;
new (buffer + length) T(value);
++length;
}
template<typename... Args)
void emplaceBackInternal(Args&&... args)
{
// Construct object into buffer using arguments;
new (buffer + length) T(std::forward<T>(args)...);
++length;
}
void moveBackInternal(T&& value)
{
// Move construct object into buffer;
// Is this forward correct or should it be move
new (buffer + length) T(std::forward<T>(value));
++length;
}
};
मैं सब यहाँ तीन जैसा कि पहले उल्लेख जवाब में प्रदान की जाती जवाब के साथ तीन कार्यों की तुलना करने में शामिल हैं। मुख्य कारण यह है कि move
और construct
ऐसा लगता है कि ऐसा लगता है कि वे समान होना चाहिए। एक टेम्प्लेटेड समारोह पैरामीटर
कास्ट करने के लिए इस परिभाषा मैं के रूप में std::move
push_back(T&& value)
अंदर और moveBackInternal(T&& value)
का उपयोग करना चाहिए द्वारा:
Answer @Potatoswatter Score 67
std :: आगे एक भी उपयोग के मामले है मान फ़ंक्शन के लिए टेम्पलेट पैरामीटर नहीं है।
Answer @Howard Hinnant Score 38
तो Y एक lvalue संदर्भ है, परिणाम एक lvalue अभिव्यक्ति हो जाएगा। यदि वाई एक लवल्यू संदर्भ नहीं है, तो परिणाम (सटीक होने के लिए xvalue) अभिव्यक्ति होगा।
इस परिभाषा के अनुसार लगता है कि मैं या तो
std::move
याstd::forward
का उपयोग कर सकता हूं।std :: आगे एक पैरामीटर वास्तव में जिस तरह से यह एक समारोह को पारित किया गया था अग्रेषित करने के लिए प्रयोग किया जाता है।
कहना है कि
std::forward
स्वीकार्य है (हालांकि अगर मैं जवाब में कड़ी का अनुसरण सभी उदाहरणों टेम्प्लेट कार्यों का उपयोग) लगता है।
एर ... आपका प्रश्न क्या है जिसका उत्तर दिए गए उत्तरों द्वारा उत्तर नहीं दिया गया था? – Barry
एर ... कौन सा जवाब सही है! प्रत्येक एक अलग परिणाम निर्दिष्ट करता है। –
वे सभी सही हैं। दो बस कहना है कि 'std :: forward' का इरादा संदर्भ अग्रेषण के लिए है और तीसरा अतिरिक्त समय बताता है कि 'std :: forward' क्या है। – Barry