2

如何将变量区分为编译器构造的字符串?

例如,虽然右值"Hello, World"的类型是const char*. const char*本身并不意味着不能更改指针。char* const指针无法更改,但这不是编译器构造的。

这是否意味着,对于任何包含 aconst char*的容器,数据应该通过 C++ 的移动语义以外的方式复制?有什么方法可以移动编译器构造的字符串而不管所有其他字符串吗?

例如,在 GCC 4.5.2 中,返回类型int而不是返回的方法int&被视为返回int&&。我不知道实际的标准是否应该是这样的,但这就是 GCC 暂时所做的。

编辑:为了澄清,我的意思是应该复制指针指向的实际内存。这意味着必须分配新的内存并且指针中的数据应该被复制到新的位置。

4

2 回答 2

9

"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)。

于 2011-03-18T00:40:19.530 回答
0

这是否意味着,对于任何包含 const char* 的容器,数据应该通过 C++ 的移动语义以外的方式复制?

这意味着指针被复制。不多也不少。必须复制指针才能使容器工作。

于 2011-03-18T00:20:47.207 回答