Rét*_*roX 2 c++ string rvalue-reference move-semantics c++11
如何将变量区分为编译器构造的字符串?
例如,虽然右值"Hello, World"是类型const char*.const char*本身并不意味着指针不能改变.一个char* const指针不能改变,但是这不是什么编译器构成.
这是否意味着,对于任何拥有a的容器,const char*数据应该通过C++的移动语义之外的方式复制?有没有办法只移动编译器构造的字符串并保留所有其他字符串?
例如,在GCC 4.5.2,它返回类型的方法int,而不是int&被当作返回int&&.我不知道实际的标准是否应该是这样的,但这就是海湾合作委员会暂时做的事情.
编辑:澄清一下,我的意思是应该复制指针指向的实际内存.这意味着必须分配新内存,并且应将指针中的数据复制到新位置.
"Hello, World"是不是类型const char*.它是类型const char[13],它是左值,而不是右值.
当您"Hello, World"在隐式转换为const char*指向其初始元素的上下文中使用时,结果指针是右值(因为它是由隐式转换产生的临时对象).
例如,在GCC 4.5.2,它返回类型的方法
int,而不是int&被当作返回int&&.
如果调用按值返回的函数(例如int),那么该函数调用表达式是一个右值表达式.如果调用返回左值引用的函数(例如int&),则该函数调用表达式是左值表达式.
如何将变量区分为编译器构造的字符串?
你不能,真的:你"Hello, World"和其他任何人之间没有任何区别const char[13].
至于const char*在标准库容器中存储s或任何其他指针类型std::vector,容器不会触及指向的数据:容器只是创建,移动,复制和销毁指针.
如果需要管理指向的数据,则需要通过编写一个类来管理指向的对象(非常类似于智能指针类)来自己完成.编写类来管理这样的资源的习惯称为"资源获取是初始化"(RAII)或"范围限制资源管理"(SBRM).
| 归档时间: |
|
| 查看次数: |
1930 次 |
| 最近记录: |