2015-09-21 4 views
8

मैं निम्नलिखित कोड है:उपयुक्त तरीका

#include <iostream> 
#include <string> 

using std::cout; 
using std::endl; 

void bar(const std::string& str) 
{ 
    cout << "const str - " << str << endl; 
} 

void bar(std::string&& str) 
{ 
    cout << "str - " << str << endl; 
} 

void foo(std::string&& str) 
{ 
    bar(str); 
} 


int main() 
{ 
    foo("Hello World"); 
} 

उपरोक्त कोड में void bar(const std::string& str) अधिभार कहा जाता हो जाता है। मैं शून्य bar(std::string&& str) अधिभार के नाम से जाना चाहते हैं मैं या तो लिखने के लिए bar(std::move(str)); या bar(std::forward<std::string>(str));

जाहिर है आगे कोड लंबे समय तक है, लेकिन यह मेरे लिए अधिक समझ में आता है। मेरा सवाल यह है कि अधिक सामान्य रूप से उपयोग और पसंद किया जाता है। bar(std::forward(str)); लेखन सबसे अच्छा समाधान imo होगा, लेकिन वह एक विकल्प :)

+3

आप इसे स्थानांतरित कर सकते हैं, आगे टेम्पलेट कोड में उपयोग किया जाना चाहिए जब आप यह सुनिश्चित नहीं कर सकते कि यह रावल्यू या लैवल्यू संदर्भ है या नहीं। :) templated कोड और मतलब सार्वभौमिक संदर्भ में, जो या तो rvalue या lvalue हो सकता है। – Melkon

+0

@Melko यदि आप अपनी टिप्पणी को उत्तर देते हैं, तो मैं इसे स्वीकार कर सकता हूं :) – rozina

+0

धन्यवाद, मैं यह करता हूं। :) – Melkon

उत्तर

6

प्रभावी आधुनिक सी ++

से हवाला देते हुए एक विशुद्ध रूप से तकनीकी दृष्टिकोण से नहीं है, जवाब है हां: std :: आगे कर सकते हैं यह सब करें। std :: चाल आवश्यक नहीं है। बेशक, न तो कार्य वास्तव में जरूरी है, क्योंकि हम हर जगह कह सकते हैं, लेकिन मुझे उम्मीद है कि हम सहमत होंगे कि यह अच्छा होगा, भाग्यशाली होगा। std :: move के आकर्षण सुविधा, त्रुटि की संभावना कम हो गई है, और अधिक स्पष्टता है।

यहाँ

void foo(std::string&& str) 
{ 
    bar(str); 
} 

std::move का उपयोग str एक rvalue संदर्भ के रूप में वापस आ जाएगी (जो आप वास्तव में क्या प्राप्त करना चाहते हैं), जबकि std::forward का उपयोग कर लौट या तो एक lvalue संदर्भ (जो आप नहीं कर रहे हैं होगा में रुचि रखते हैं) या एक रावल्यू संदर्भ (इस प्रकार इस मामले में समतुल्य std::move)। स्पष्ट रूप से किसी का उपयोग करने से const std::string& str को कॉल करना जारी रहेगा क्योंकि str उस फ़ंक्शन में एक लवली है।

नीचे लाइन: वे एक ही बात करना होगा लेकिन std::move का उपयोग कर पसंद किया जाता है

  • के बाद से यह स्पष्ट टेम्पलेट तर्क को निर्दिष्ट टाल
  • यह अधिक मुहावरेदार
  • यह सीधे बात करने के लिए चला जाता है: std::forward इसका उपयोग इस तरह से नहीं किया जाना चाहिए (सीएफआर Universal references) या उस संदर्भ में हालांकि यह निश्चित रूप से

मैं सहमत हूं कि "मैं इस कार्यवाही संदर्भ को अन्य फ़ंक्शन" के लिए अग्रेषित कर रहा हूं "एक स्टैंडअलोन वाक्य के रूप में समझ में आ सकता है लेकिन इस तरह के मामले को याद किया जाता है। आप फिर से तार अपने दिमाग की तरह "रखें अन्य समारोह करने के लिए 'आगे बढ़' इस rvalue संदर्भ"

इसके अलावा संभवतः संबंधित यह सोचने के लिए कर सकते हैं: https://stackoverflow.com/a/18214825/1938163

3

आप इसे स्थानांतरित कर सकते हैं जब भी आप यकीन है कि यह एक rvalue है कर रहे हैं संदर्भ।

फ़ॉरवर्ड को टेम्पलेट कोड में उपयोग किया जाना चाहिए जब आप यह सुनिश्चित नहीं कर सकते कि यह रावल्यू या लैवल्यू संदर्भ है या नहीं। :)

टेम्पलेट कोड & & का मतलब सार्वभौमिक संदर्भ है, जो या तो रैवल्यू या लैवल्यू हो सकता है।

यह भी ध्यान दें कि std :: move बिना किसी जांच के इसे कास्टिंग कर रहा है, आगे के विपरीत, इसलिए अग्रेषित सुरक्षित है यदि आप सुनिश्चित नहीं हैं कि आपको क्या करना चाहिए, तो तेज़ी से चलना चाहिए।

संबंधित मुद्दे