如何解决非平凡的右值和左值示例
我不确定一些右值/左值非临时性示例。
在左值或右值下方的std::vector<int>({1,2,3})[0]
和std::vector<int>()
表达式是什么?
该代码没有实际用法,但令我惊讶的是该代码有效。看起来它们都是左值。还是不?
#include <vector>
int main()
{
std::vector<int>({1,3})[0] = 0;
std::vector<int>() = {1,3};
return 0;
}
更多示例...
下面的std::vector<int>()
表达式是一个右值。对?
以及表达式std::vector<int>({1,3})[0]
呢?
来自std::vector<int>()
的向量对象和来自...[0]
的int值都是临时值。对吧?
auto v = std::vector<int>();
int i = std::vector<int>({1,3})[0];
解决方法
%>%
是一个右值,因为语法std::vector<int>()
总是产生一个右值。允许使用type()
是因为通常允许分配给类类型的右值,但是可以通过使用&
qualifier定义std::vector<int>() = {1,2,3};
来禁止特定类的使用,operator=
不能这样做。做。
std::vector
是左值,因为std::vector<...>::operator[]
被定义为返回左值引用。可以根据返回值是左值还是左值来定义它返回右值或左值(请参见上面的链接),但是std::vector<int>({1,3})[0]
不会这样做。
来自std :: vector()的矢量对象和来自... [0]的int值是临时值。对吧?
std::vector
-是的。 vector
-不,至少是正式的。
某个对象是否为临时对象仅取决于其创建方式,例如int
总是会给您一个临时的机会。
向量在堆上分配其元素,这将导致正常的非临时对象。向量本身是临时的都没关系。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。