निम्नलिखित को ध्यान में रखते:ले जाएँ अर्थ विज्ञान और तर्क मूल्यांकन आदेश
std::string make_what_string(const std::string &id);
struct basic_foo
{
basic_foo(std::string message, std::string id);
};
struct foo
: public basic_foo
{
foo::foo(std::string id)
: basic_foo(make_what_string(id), std::move(id)) // Is this valid?
{
}
};
क्योंकि सी ++ में पैरामीटर मूल्यांकन आदेश अनिर्दिष्ट है, मैं अगर सोच रहा हूँ लाइन
basic_foo(make_what_string(id), std::move(id))
उपरोक्त कोड में
मान्य है।
मुझे पता है कि std::move
एक कलाकार से अधिक कुछ नहीं है, लेकिन std :: string कब सीटीओ निष्पादित किया जाता है? सभी तर्कों का मूल्यांकन करने के बाद और अब समय निर्माता पर कॉल करने का समय है? या यह पैरामीटर के मूल्यांकन के दौरान किया जाता है? दूसरे शब्दों में:
करता है संकलक ऐसा करते हैं:
std::string &&tmp2 = std::move(id);
std::string tmp1 = make_what_string(id);
basic_foo(tmp1, tmp2);
जो वैध है। या यह:
std::string tmp2 = std::move(id);
std::string tmp1 = make_what_string(id);
basic_foo(tmp1, tmp2);
जो अमान्य है। ध्यान दें कि दोनों मामलों में आदेश "अप्रत्याशित" एक है।
दरअसल, कोड मान्य है। हालांकि, मेरा मानना है कि आप 'base_foo' के कन्स्ट्रक्टर में स्ट्रिंग' आईडी 'को मूल्य के बजाय रैल्यू संदर्भ द्वारा लेना चाहते थे (क्या आप नहीं?)। –
@CassioNeri, कोई कोड इरादा नहीं है :) – Tom
हाँ, मुझे एहसास हुआ कि दोपहर के भोजन के दौरान। :-) बहुत अच्छा सवाल है। –