所以我问了这个问题,我正在通过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/
成员函数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);
>
是的,它与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的对齐要求,则结果指针值是未指定的。否则,如果原始指针值指向一个