允许获取右值的地址
Taking address of an rvalue allowed?
我正在练习这里描述的东西来学习左值和右值的概念。
但是,当我按如下方式编写自己的示例时,我发现它编译和运行没有任何错误(使用 VS2017)。我了解到,在情况 1 中,它与调用
相同produceA(10).operator=(A())
因此是合法的。但是,我仍然不明白为什么允许使用案例 2 和 3。事实上,案例 2 甚至与文章中给出的示例相矛盾。在这两种情况下,我实际上是否得到了右值的地址?它们会导致未定义的行为吗?
#include <string>
class A
{
int data = 1;
public:
A() = default;
A(int in)
: data(in)
{}
A& operator=(const A& rhs)
{
data = rhs.data;
return *this;
}
};
A produceA(int i)
{
A a(i);
return a;
}
int main()
{
// case 1
produceA(10) = A();
// case 2
A* pa = &produceA(10); // rvalue?
// case 3
std::string* pstr = &std::string("Temp"); // rvalue?
return 0;
}
&produceA(10)
是从函数返回的 A
类型的匿名临时的地址。您可以设置指向它的指针,但该指针仅在整个语句的生存期内有效。
&std::string("Temp")
也可以这样说;同样,这是一个匿名临时的地址。
相关文章:
- 如何在C++中获取该对象的类声明中对象的地址?
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- 如何获取C++字符数据类型的地址
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 如何在 c++ stl 中获取列表中被推回的元素的地址,在常量时间内?
- 是否可以在C++中获取 CHAR 的有效十六进制地址?
- 动态获取 esp32 的 mac 地址并在以太网库中使用它.
- 如何根据指针地址获取指针内容
- 从对象及其成员的地址获取指向成员的指针
- 如何从地址获取字符串?
- 从内存地址获取值
- PIN从指令地址获取程序集操作码
- 使用数组的地址获取过期指针
- 从调用堆栈地址获取函数参数
- 从IP地址获取完整的计算机名称,例如 abc.xyz.xvvx.net
- 如何通过地址获取元组中元素的索引
- 从成员的地址获取成员的索引
- 从IPv4地址获取网络接口名称
- 如何通过符号在内存中的地址获取有关符号的更多信息
- 正在WinDbg中按地址获取类型