c++ - 为什么占用临时地址是非法的?

标签 c++ temporary memory-address lvalue rvalue

我知道下面写的代码是非法的

void doSomething(std::string *s){}
int main()
{
     doSomething(&std::string("Hello World"));
     return 0;
}

原因是我们不允许获取临时对象的地址。但我的问题是为什么?

让我们考虑下面的代码

class empty{};
int main()
{
      empty x = empty(); //most compilers would elide the temporary
      return 0;
}

接受的答案here提到

“通常编译器将临时和拷贝视为两个对象,它们位于完全相同的内存位置并避免复制。”

根据该语句,可以得出结论,临时存在于某个内存位置(因此它的地址可能已被占用),并且编译器决定通过在相同的位置创建一个就地对象来消除临时对象。临时存在。

这是否与不能取临时地址的事实相矛盾?

我也想知道返回值优化是如何实现的。有人可以提供与 RVO 实现相关的链接或文章吗?

最佳答案

&std::string("Hello World")

问题不在于 std::string("Hello World") 产生一个临时对象。问题是表达式 std::string("Hello World") 是一个引用临时对象的右值表达式。

你不能获取右值的地址,因为不是所有的右值都有地址(也不是所有的右值都是对象)。考虑以下几点:

42

这是一个整数文字,它是一个主表达式和一个右值。它不是一个对象,它(可能)没有地址。 &42 是无意义的。

是的,右值可以引用一个对象,就像您的第一个示例中的情况一样。问题是并非所有的右值都指向对象。

关于c++ - 为什么占用临时地址是非法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4301179/

相关文章:

c++ - 错误 : "expected constructor, destructor, or type conversion before ' typedef' "

assembly - 缓冲区溢出攻击(攻击实验室第 2 阶段)

c++ - 在 MFC DLL 中导出返回 vector 的函数

c++ - for (int x : temps) in C++ 的含义

c++ - 警告:支持指针的对象将在 std::pair 的完整表达式结束时销毁

c++ - 在单个语句中将临时字符串流转换为 c_str()

c++ - 为什么写入临时流失败?

c - RTEMS 如何获得 DMA 可访问内存

c - 在C中查找数组中索引的地址

c++ - 使用 CMake 为 VS 2017 生成解决方案的问题