当前位置: 首页 > 知识库问答 >
问题:

它是应用于const_cast的操作数的临时物化转换吗

何玉韵
2023-03-14
int main(){
  const_cast<int&&>(0);
}

据expr。康斯特。演员阵容#4

对于两种对象类型T1和T2,如果可以使用常量将指向T1的指针显式转换为类型“指向T2的指针”,则还可以进行以下转换:

  • T1类型的左值可以使用强制转换常量显式转换为T2类型的左值

如果操作数是glvalue,则引用const_转换的结果指的是原始对象,否则指的是应用临时物化转换的结果。

由于操作数0是int类型的prvalue,指定的类型是int类型的右值引用。因此,在执行临时物化转换后,可以在此处应用第二个项目符号,该转换使原始操作数根据expr#basic成为glvalue。lval-7

每当prvalue显示为运算符的操作数,并且该运算符需要该操作数的glvalue时,就会应用临时物化转换将表达式转换为xvalue。

但是,此片段被Clang和GCC都拒绝。如果我们将操作数更改为int{0}

int main(){
  const_cast<int&&>(int{0});
}

只有GCC接受该代码。但GCC仍然无法编译以下代码

int main(){
  const_cast<int&&>(int(0));
}

当操作数分别为0int{0}int(0)时,我不知道这里有什么区别。在我看来,它们都是int类型的prvalue。

typedef int *A[3];  
typedef const int *const CA[3];
int main(){
   A &&r2 = const_cast<A&&>(CA{}); 
}

此代码是expr的正式示例。康斯特。演员阵容#3。不幸的是,它被叮当声拒绝了。

我不知道这是否会被认为是标准的缺陷,还是Clang的错误实现?我不知道[expr.const.cast#4]的第三个项目的意图是什么,为什么它特别提到类类型的prvalue?(它是否打算说只有类类型的prvalue才会被临时物化?然而,它显然与数组类型的prvalue的示例相矛盾)。

共有1个答案

李森
2023-03-14

这里的关键是T1是否是类类型。类型int不是类类型,因此4.3不适用。如果您使用的是std::string,那么它可以:

const std::string && x = const_cast<std::string&&>(std::string("foo") + "bar");
 类似资料:
  • 比尔在《火花权威指南》一书中说,阅读是一种转换,而且是一种狭义的转换, 现在,如果我运行下面的spark代码并尝试查看spark UI,我会看到一个创建的作业

  • 访问 获取子节点的Path 为了得到一个AST节点的属性值,我们一般先访问到该节点,然后利用 path.node.property 方法即可。 // the BinaryExpression AST node has properties: `left`, `right`, `operator` BinaryExpression(path) { path.node.left; path.n

  • 问题内容: 我正在做一些性能分析,我想知道,当数据类型已知(双精度)时,是否将其标准数组操作向量化。 编辑:此操作是否被向量化,即计算将包含SIMD运算吗? 问题答案: 对,他们是。 链接:github上的Numpy simd.inc.src。

  • GraphX中的转换操作主要有mapVertices,mapEdges和mapTriplets三个,它们在Graph文件中定义,在GraphImpl文件中实现。下面分别介绍这三个方法。 1 mapVertices mapVertices用来更新顶点属性。从图的构建那章我们知道,顶点属性保存在边分区中,所以我们需要改变的是边分区中的属性。 override def mapVertices[VD2:

  • 这个类别的全部是展示以某些东西为基础来创建 Observables 是多么的容易,因此他们可以和操作符配合的很好,而不在乎是怎样的构造,从而实现丰富的组合。 from 在 RxJS 4中,存在一些类似名称的操作符,例如 fromArray()、from()、fromPromise() 等等。所有这些 fromXXX 的操作符现在全由 from() 接管了。来看一些示例: 老的 fromArray

  • 描述 (Description) Popover无法用于平板电脑上的手机(iPhone)和动作表,因此您可以使用扩展的ActionSheet语法,它将动作表转换为平板电脑上的自动弹出窗口。 您可以使用如下所示的方法 - myApp.actions(target, groups) - 用于创建和打开具有已定义数量的按钮组的Action Sheet(或平板电脑上的popover)。 OR myApp.