Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回引用和复制对象的类型_C++_String_Copy - Fatal编程技术网

C++ 返回引用和复制对象的类型

C++ 返回引用和复制对象的类型,c++,string,copy,C++,String,Copy,如果我从函数返回std::string&并且返回类型是赋值的右值,那么我会从GCC收到一条警告消息。这是因为通过引用传递不会正确复制吗?错误表明我正在传递一个临时值,我正在传递,因为它很快将从堆栈中删除 这里有一些代码供您考虑:我要做的是一个问题吗 const std::string& TranslationTable::EnglishTranslate() { return "end"; } 和主管道内部: std::string me; me = EnglishTransl

如果我从函数返回std::string&并且返回类型是赋值的右值,那么我会从GCC收到一条警告消息。这是因为通过引用传递不会正确复制吗?错误表明我正在传递一个临时值,我正在传递,因为它很快将从堆栈中删除

这里有一些代码供您考虑:我要做的是一个问题吗

const std::string& TranslationTable::EnglishTranslate()
{
    return "end";
}
和主管道内部:

std::string me;
me = EnglishTranslate();

返回字符串的内容是否会正确复制到
me

“end”
表示的
常量字符数组将转换为类型为
std::string
的临时对象。只要
EnglishTranslate
返回,该临时文件就会被销毁。这使得返回的引用悬空,而不是指向有效的对象

将返回的引用传递给
me
的copy assignment操作符将导致未定义的行为(假设该操作符被定义为执行它应该执行的操作)

我建议改为按值返回:

std::string TranslationTable::EnglishTranslate()
{
    return "end";
}
不要担心返回值的副本-允许编译器完全删除副本


从函数返回引用的唯一真正常用方法是返回对数据成员的引用。与局部变量不同,数据成员不会在函数末尾被销毁。有关示例,请参见。

表示的
常量字符
数组“end”
被转换为类型为
std::string
的临时对象。只要
EnglishTranslate
返回,该临时文件就会被销毁。这使得返回的引用悬空,而不是指向有效的对象

将返回的引用传递给
me
的copy assignment操作符将导致未定义的行为(假设该操作符被定义为执行它应该执行的操作)

我建议改为按值返回:

std::string TranslationTable::EnglishTranslate()
{
    return "end";
}
不要担心返回值的副本-允许编译器完全删除副本

从函数返回引用的唯一真正常用方法是返回对数据成员的引用。与局部变量不同,数据成员不会在函数末尾被销毁。有关示例,请参见

我要做什么是个问题吗

const std::string& TranslationTable::EnglishTranslate()
{
    return "end";
}
是。

根据C++11标准第12.2/5段:

函数返回语句(6.6.3)中返回值的临时绑定的生存期不是 扩展的在return语句的完整表达式末尾销毁临时表达式

因此,函数返回的引用是悬空的,在取消引用它时,您有未定义的行为

我要做什么是个问题吗

const std::string& TranslationTable::EnglishTranslate()
{
    return "end";
}
是。

根据C++11标准第12.2/5段:

函数返回语句(6.6.3)中返回值的临时绑定的生存期不是 扩展的在return语句的完整表达式末尾销毁临时表达式



因此,函数返回的引用是悬空的,在取消引用它时,您有未定义的行为。

。。。或者我应该传递一个std::string&作为参数并在函数中进行复制?@EdwardBird按值返回。永远不要返回对临时对象的引用。@EdwardBird相关文章。这是关于通过值返回与作为函数参数传递引用的优点。。。。或者我应该传递一个std::string&作为参数并在函数中进行复制?@EdwardBird按值返回。永远不要返回对临时对象的引用。@EdwardBird相关文章。这本书是关于按值返回与将引用作为函数参数传递的优点。人们一直在引用的这本书是什么?能给我一份吗?@EdwardBird:这是C++11标准。你可以下载原版,但你必须付费。或者你可以从免费下载最新的草稿。@EdwardBird Andy Prowl刚刚链接到最新的草稿。不过要当心——这不是给胆小鬼的。@switrabbit每晚几页——我会在下一稿写完时写完。@EdwardBird:别这么乐观!;-)人们经常引用的这本书是什么?能给我一份吗?@EdwardBird:这是C++11标准。你可以下载原版,但你必须付费。或者你可以从免费下载最新的草稿。@EdwardBird Andy Prowl刚刚链接到最新的草稿。不过要当心——这不是给胆小鬼的。@switrabbit每晚几页——我会在下一稿写完时写完。@EdwardBird:别这么乐观!;-)返回
常量&
是错误的设计,除非返回成员变量…返回
常量&
是错误的设计,除非返回成员变量。。。