为函数调用了Move构造函数,但在C ++中预期为NRVO

问题描述 投票:1回答:1

我不明白为什么在下面的代码中的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;
}
c++ return-value move-semantics rvalue-reference rvalue
1个回答
-1
投票

像NVRO / RVO这样的外观实际上不能保证在C ++ 17之前发生,并且在某些情况下RVO从17开始。这里有一篇很好的文章供其他想了解更多信息的人使用!

https://shaharmike.com/cpp/rvo/

© www.soinside.com 2019 - 2024. All rights reserved.