是函数返回的临时对象,并不总是 r 值
Is a function-returned temporary object not always r-value?
struct Test
{
Test()
{}
Test(const Test& other)
{
cout << "Copy" << endl;
}
Test(Test&& other)
{
cout << "Move" << endl;
}
};
Test* f()
{
static Test t;
return &t;
}
int main()
{
auto t = *f();
return 0;
}
输出为:复制
*f()
显然是一个匿名的临时对象,因此它应该是一个 r 值,并且应该调用移动构造函数。为什么编译器将*f()
视为 l 值?
是编译器的错误,还是我的理解错误?
f()
的结果是 Test*
类型的匿名临时对象。 f()
是一个右值。
*f()
通过所述指针执行间接寻址。与使用间接寻址运算符时的情况一样,结果为左值。
为什么编译器将 *f(( 视为 l 值?
因为它是l值。运算符 * 应用于指针时的结果始终是 l 值。而且您不能隐式地从 l 值移动。
记住运动的黄金法则:只有在保证安全的情况下才能发生运动(对于">保证"的某个定义(。
查看您的代码。是否很明显,您要移动的对象将被破坏并且在移动后无法访问?如果没有,那么您必须使用std::move
从它移动;这告诉系统,你对由于运动而发生的任何搞砸负责。
> 实际上,f()
的返回是一个指针。 取消引用指针不会导致新对象突然出现。 但是,您正在将返回值指向的内存地址处的任何内容复制到 t
中。 在这种情况下,我当然希望有一份副本。
"*f(( 显然是一个匿名的临时对象...">
不,不是! 它是一个静态对象。
Test f()
{
return Test();
}
int main()
{
auto t = f();
return 0;
}
现在你返回一个匿名临时 - 线索是创建一个临时并按值返回它,而不将其绑定到名称。
正如其他人正确指出的那样,您正在做的是返回指向静态(非临时(命名(非匿名(对象的指针。 指针可能是匿名的临时指针,但它指向的东西不是。
相关文章:
- 从函数返回const char*数组
- 检查函数返回类型是否与STL容器类型值相同
- 从 c 或 cpp 系列子函数返回到主函数
- 从函数返回任意简单类型的数据
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 从 C++ 中的函数返回数组地址问题
- VirtDisk.h QueryChangesVirtualDisk() 函数返回 RangeCount 为 0
- 为什么glGetSubroutineIndex为不同的函数返回相同的值?
- 在 c++ 中将函数返回类型指定为模板参数
- 从封装在对象中的函数 C++ 返回时为空的列表
- 为什么向量内部的指针在从函数返回时会发生变化?
- 函数返回的 rvalue 引用(表达式)是 xvalue - 但没有标识?
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- 寿命延长从函数返回引用
- 程序不向函数返回值
- 字符串函数返回奇怪的值
- 类的大问题,以及从空函数c++返回
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- C++二叉搜索树模板从函数返回节点
- NVCC 错误:string_view.h:constexpr 函数返回是非常量