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

static_cast对T做了什么

危烨煜
2023-03-14

所以我问了这个问题,我正在通过static_cast解决它。(顺便说一句,它确实解决了问题,我只是不确定我是否理解原因。)

在代码中:

vector<int> foo = {0, 42, 0, 42, 0, 42};
replace(begin(foo), end(foo), static_cast<int>(foo.front()), 13);

static_cast只是构造一个R值int吗?这和仅仅打电话有什么区别:

replace(begin(foo), end(foo), int{foo.front()}, 13);

编辑:

根据答案推断,< code>static_cast似乎确实构造了一个R值< code > int :http://ideone.com/dVPIhD

但此代码在Visual Studio 2015上不起作用。这是编译器错误吗?此处测试:http://webcompiler.cloudapp.net/

共有2个答案

祁雪峰
2023-03-14

成员函数front返回对非空向量的第一个元素的引用。

另一方面,标准算法替换声明如下

template <class ForwardIterator, class T>
  void replace (ForwardIterator first, ForwardIterator last,
                const T& old_value, const T& new_value)

也通过引用获取第三个参数。因此,一般来说,向量的第一个元素可能会被算法改变,因此,算法对向量的其他元素的处理可能是不正确的。

使用static_cast创建一个临时对象,并且不会被算法更改,因此矢量的所有元素的处理将是正确的。

至于我,然后我建议在这种情况下使用关键字auto的C提案。例如

replace(begin(foo), end(foo), auto( foo.front() ), 13);
习淇
2023-03-14

>

  • 是的,它与int{…}相同,除非。front()返回了一个需要收缩转换的类型。在这种情况下,int(…)将是相同的。

    在程序员错误的情况下,静态转换做危险事情的可能性略低于int(…),例如将指针转换为int。

    请注意,消除强制转换会导致未定义的行为,因为前部元素被替换操作修改,这可能会破坏 std::replace

    我会使用

    template<class T>
    std::decay_t<T> copy_of(T&& t){return std::forward<T>(t); }
    

    我自己在这里。

    至于为什么这在MSVC中不起作用...

    MSVC可以帮助您将T类型的变量转换为T类型,然后继续不做任何事情。这会破坏您的代码。

    有一个编译器标志(/Zc:rvalueCast)可以让MSVC不再破坏你的代码。

  •  类似资料:
    • 根据正式文件: public void close()引发IOException null null 那么它是什么都不做还是什么都不做?

    • 我正在做一个项目,我的意图是运行一个玉米作业,并发送邮件给我的朋友,祝他们生日,我能够从MySQL DB获取电子邮件,并将其与当前日期进行比较,但当涉及到发送电子邮件时,我得到NullPointerException。 我确信应用程序属性没有问题,我在其他项目中也使用了它们,它们的功能正常 这是我得到以下信息的错误

    • defineProps做了什么? script setup文档 里面的代码会被编译成组件 setup() 函数的内容。这意味着与普通的 <script> 只在组件被首次引入的时候执行一次不同,<script setup> 中的代码会在每次组件实例被创建的时候执行。 defineProps 和 defineEmits 都是只能在 <script setup> 中使用的编译器宏。他们不需要导入,且会随

    • 这不是重复我的问题。我检查了它,我的是如何使用正确的谓词,这是关于removeIf和remove之间的区别。 我是Java程序员的初学者。 昨天,我试着学习了这篇教程https://dzone.com/articles/why-we-need-lambda-expressions 在学习了如何使用Lambda表达式和谓词之后,我制作了自己的代码来练习。 比如,如果(n%3==0n%5==0)和所有

    • 问题内容: 连接到MySQL数据库时,请执行以下步骤 实际上,我想知道语句的作用。 虽然此类不在mysql.jar中。它在哪里? 问题答案: 本类位于java.lang包,因此在分布用java,并自动导入到每个班级。 该方法所做的只是返回由类加载器加载的参数对象。然后,该方法返回该类的新实例。 因此,发生什么情况是您称之为 返回com.mysql.jdbc.Driver.class。然后,您调用该

    • 在当前的标准草案(和C 17)中,这是关于静态强制转换一个< code>void *: “指向cv1 void的指针”类型的prvalue可以转换为“指向cv2 T的指针”类型的prvalue,其中T是一个对象类型,cv2与cv1具有相同的cv资格,或者比cv1具有更高的cv资格。如果原始指针值表示内存中某个字节的地址A,而A不满足T的对齐要求,则结果指针值是未指定的。否则,如果原始指针值指向一个