C++ 字符串作为c++;功能

C++ 字符串作为c++;功能,c++,string,function,return-value,C++,String,Function,Return Value,这是一个基本问题,但我并不完全理解。 当我有一个函数,如: string func(){ string result; result = "resultString"; return result; } 这是正常的还是字符串结果只是一个局部变量(可能超出范围) 如果可以,为什么?这是按值返回的吗 C++中的哪些类型是由值返回的,引用什么? 这是确定的还是字符串结果只是一个局部变量 这很好。返回一个值,但该值可能受NRVO约束 如果可以,为什么

这是一个基本问题,但我并不完全理解。 当我有一个函数,如:

string func(){
        string result;
        result = "resultString";

        return result;
}
这是正常的还是字符串结果只是一个局部变量(可能超出范围)

如果可以,为什么?这是按值返回的吗

<> C++中的哪些类型是由值返回的,引用什么? 这是确定的还是字符串结果只是一个局部变量

这很好。返回一个值,但该值可能受NRVO约束

如果可以,为什么?这是按值返回的吗

对。您编写了
string
作为返回类型,这意味着一个值

<> C++中的哪些类型是由值返回的,引用什么? 在C++中,你可以很好地控制它。代码>字符串f()表示返回类型为
string
的值的函数<代码>字符串&f()返回对该值的引用

如果可以,为什么?这是按值返回的吗


作为对前面答案的补充,我认为结果是一个局部变量;由于函数()原型指定返回是按值,而不是引用,所以C++编译器实际上调用STD::String复制构造函数来初始化函数()返回值,并使用结果局部变量的副本(谨防如果代码没有复制构造,C++编译器将创建一个,只实现浅拷贝)

谷歌:移动语义并按值返回您所做的一切都很好。除了返回引用之外,C++中的所有东西都是按值返回的。引用在返回时,实际上是复制到内存中的,就像指针一样。从技术上讲,您仍然返回一个值。@ LukPik它与C++标准中的不同。它的实现方式可能与指针返回相同,但也可能不同。例如,语义差异对于优化非常重要。由于NRVO或move语义,可能无法调用复制构造函数。根据上面代码中的事实,它很可能不会被调用。没错,复制构造函数不会一直被调用,这取决于编译器的行为。