标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
What does this mean "prvalue of type“ in C++ standard N3337 5.2.10 clause 7?
在C++草案标准N3337第5.2.10节Reinterpret cast
第7条(强调我的):
可以显式转换为指向其他类型的对象指针。当类型为"指向 T1 的指针"的prvalue v 转换为"指向 cv T2 的指针"类型时,如果 T1 和 T2 都是标准布局类型 (3.9) 并且对齐方式,则结果
static_cast<cv T2*>(static_cast<cv void*>(v))
T2 的要求并不比 T1 的要求更严格,或者如果任一类型无效。
这是否意味着表达式v
是一个 prvalue?如果是这样,那么
int a = 0x1234;
int *pa = &a;
char *pc = reinterpret_cast<char *>(pa);
上面,变量pa
是一个lvalue
,那么我们是否可以认为如果lvalue
的变量在正确的表达式中,则该变量是类型的prvalue
?
cpp偏好是你的朋友,如果我们转到主题值类别,它会告诉我们一个 prvalue是:
prvalue("纯"rvalue)是一个表达式,其计算结果
- 计算运算符的操作数的值(此类 prvalue 没有结果对象),或
- 初始化对象或位字段(此类 prvalue 称为具有结果对象)。所有类和数组 prvalues 都有一个结果对象,即使它被丢弃也是如此。在某些情况下,发生临时具体化以创建临时作为结果对象;
这不会自动启发,但它们在下面提供了一组非常好的示例,我将引用一些指针示例:
以下表达式是 prvalue 表达式:
。
- &a,内置的表达式地址;
...- 这个指针;
....
因此,将this指针或 address-of 的结果转换为该类型指针的 const 将适合措辞(假设它还没有 const),例如:
{
int x = 0;
const int *p = reinterpret_cast<const int*>(&x);
}
规范使用v
来表示表达式。它不一定是变量的名称。
在您的示例中,您提到的段落不直接适用,因为pa
是一个左值。相反,首先应用左值到右值的转换,然后应用本段。
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 构造函数正在调用一个使用当前类类型的函数
- 我应该使用什么来代替void作为变体中的替代类型之一
- 类中的字符串不命名类型