我不明白为什么在下面的代码中的main函数中调用了一个移动构造函数,特别是输出是:
FString::FString(string one)
FString::FString(string two)
FString::Move Constructor
FString::Move Assign
COMPLETE
因此,我关心的行是“ FString :: Move构造函数”-对我而言,这意味着为了实现功能GetStringTemp()的return语句,将调用move构造函数,但是据我了解,NRVO应该表示不应该调用move构造函数。我是否误解了NVRO的行为?在此先感谢
#include <iostream>
#include <string>
class FString
{
public:
FString(std::string newstring)
: _string(newstring)
{
std::cout << "FString::FString(string "+newstring+")" << std::endl;
}
FString(const FString& rhs)
{
std::cout << "FString::Copy Constructor" << std::endl;
}
FString(FString&& rhs)
{
std::cout << "FString::Move Constructor" << std::endl;
}
FString& operator=(const FString& rhs)
{
std::cout << "FString::Copy Assign" << std::endl;
return *this;
}
FString& operator=(FString&& rhs)
{
std::cout << "FString::Move Assign" << std::endl;
return *this;
}
void Print()
{
std::cout << "Printing: "+_string << std::endl;
}
private:
std::string _string;
};
FString GetTempString()
{
FString temp = FString("two"); // 2: Expected Constructor cout
return temp; // No expected constructor as NVRO assumed
}
int main()
{
FString myString = FString("one"); // 1: Expected Constructor cout
myString = GetTempString(); // 3: Expected Move Assignment cout
std::cout << "COMPLETE" << std::endl;
}
像NVRO / RVO这样的外观实际上不能保证在C ++ 17之前发生,并且在某些情况下RVO从17开始。这里有一篇很好的文章供其他想了解更多信息的人使用!