用C++返回一个对象

Dan*_*B91 9 c++ c++11

我从大多数C和Java的背景学习C++,我很好奇在没有复制对象的情况下,用C++返回对象的最佳方法是什么.根据我的理解,C++ 11引入了右值引用(&&)来从临时变量移动数据(与复制相反).例:

std::string getStr(){
   return "Hello";
}

std::string &&hello = getStr();
Run Code Online (Sandbox Code Playgroud)

我能想到的另一种方法是使用共享指针.

std::tr1::shared_ptr<std::string> getStr(){

    std::tr1::shared_ptr<std::string> hello(new std::string("Hello"));
    return hello;

}

auto hello = getStr();
Run Code Online (Sandbox Code Playgroud)

我想也许一个右值参考更好,但在使用它之前我想先得到第二个意见.哪个更好?

如果不使用构造函数设置它们,还是建议类中的字段是右值引用吗?例:

class StringHolder{

   public:
     std::string &&str;
};

StringHolder sh;
sh.str = getStr();
Run Code Online (Sandbox Code Playgroud)

非常感谢你们!

How*_*ant 10

这个问题可能会以副本的形式结束.这是一个经常被问到的问题.无论如何我想回答它.

在C++ 11中,当你是一个像对象的客户端时std::string,你应该按价值传递它,而不是担心效率:

std::string getStr(){
   return "Hello";
}

std::string hello = getStr();
Run Code Online (Sandbox Code Playgroud)

在这个级别,您不需要关心右值引用.只知道std::string可以非常有效地从rvalues(例如返回getStr())中"复制" .这个"副本"实际上称为"移动",并且自动启用,因为您正在从右值(匿名临时)进行复制.

不要尝试通过恢复引用计数来优化复制.如果您需要共享所有权语义,请仅使用引用计数.这种说法并非总是如此.但是为了学习基础知识,它足够接近以下是一个很好的经验法则.

在设计需要按值传递的类时,需要开始担心rvalue引用:

class Widget
{
    // pointer to heap data
public:
    // ...
};
Run Code Online (Sandbox Code Playgroud)

有关rvalue引用和移动语义的简要介绍,N2027是一个不错的教程.N2027太长了,无法粘贴在这里,但足够短,易读. std::string遵循N2027中规定的基础知识,让您可以通过价值无罪传递它.你可以在你的网站上遵循相同的设计模式Widget.