问题标签 [static-cast]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - static_cast 和临时创作(最终版)
先决条件: 要理解这个问题,请先阅读以下问题及其答案: Cast auto_ptr<Base> to auto_ptr<Derived>
在 将 auto_ptr<Base> 转换为 auto_ptr<Derived> 时,Steve 回答说:“您的 static_cast 会将 auto_ptr 复制到临时对象,因此 aS 将被重置,并且当临时对象存在时(在语句末尾),资源将被销毁。 "
我对static_cast
调用时的临时创建过程感兴趣。我想拥有可以跟踪的代码以查看此效果。我不能使用static_cast<auto_ptr<Circle>> ...
,因为它无法编译,所以我需要编写一些模拟类而不是auto_ptr
观看临时创建的过程。
我也明白临时创建与复制构造函数调用密切相关。
的所有权丢失是通过将源字段设置为负值auto_ptr
的复制分配来模拟的(我需要 的简单逻辑模型)。_radius
auto_ptr
所以,我建议以下Circle
课程:
行。在这里我们可以看到“所有权转移”正在发生c2 = c3
。但我无法在static_cast
.
问题是:如何对临时对象的创建进行小模拟static_cast
?
我相信史蒂夫是在铸造时创建的临时对象。我唯一想要的是编写一个显示临时创建的示例。这个目标有学术原因。
有人可以澄清如何达到史蒂夫在提到的主题上发布的答案中描述的效果吗?
c++ - static_cast 的神秘行为
我正在尝试实现一类数字向量。我正在使用类似于 STL 向量的 Qt 模板 QVector
让我困惑的是
根本不起作用。我试图逐行调试它,并且 VectorFloat::operator<< 根本没有被调用。没有错误,程序编译并运行,但什么也不做。但是,这有效:
我只是好奇为什么会这样。我试图深入研究 static_cast 命令,但我无法弄清楚。
请帮我。
c++ - std::bind() 中 static_cast 的函子版本
我尝试实现一个仿函数版本,static_cast
用于std::bind()
.
我知道 Boost ll_static_cast<K>()
(请参阅using static_cast with boost::bind),但我现在没有使用 Boost。
为什么有几个标准运算符没有标准函子中有一个代码示例?但它不会在 GCC 4.2.1 上编译:
我设法编译了一些东西,但我不确定它是否正确:
有人可以告诉我这个版本是否正确,如果是这样,为什么我需要std::unary_function
前面的代码示例中没有使用的版本?
用法:
c++ - C++ 多重继承 + 虚函数(-歧义)= 奇怪的行为(也是函数指针)
我正在创建几个旨在提供对回调功能的访问的接口。也就是说,从接口 A继承允许类使用类型一的回调;接口 B允许类型二。从 A 和 B 继承都允许这两种类型的回调。最终目的是类 A 和 B 将通过从它们继承来处理所有脏活。
第一个问题
这是一个小例子,应该说明我遇到的一些麻烦:
通过拨打电话
我希望我会得到“AB”作为输出。相反,我得到“AA”。颠倒派生类的顺序(B 在 A 之前),产生“BB”。为什么是这样?
第二个问题
我使用的实际接口是模板化的,所以代码看起来更像
这样做的原因是 A 和 B 可以完成所有工作,但他们的实现不需要任何 C 知识。
现在,调用
产生正确的输出:“AB”。
这个小例子在这里工作得很好,但在实践中并不总是能正常工作。非常奇怪的事情开始发生,类似于上面第一个问题中的怪异。主要问题似乎是两个虚函数(或静态函数,或其他东西)并不总是能进入 C 语言。
例如,我可以成功调用 C::AFoo(),但并非总是调用 C::BFoo()。这有时取决于我从 A 和 B 派生的顺序:class C: public A<C>, public B<C>
可能会生成 AFoo 或 BFoo 都不工作的代码,而class C: public B<C>, public A<C>
可能会生成其中一个工作的代码,或者两者兼而有之。
由于类是模板化的,我可以删除 A 和 B 中的虚函数。这样做会产生工作代码,当然只要 C 中存在 ABar 和 BBar。这是可以接受的,但不是我们想要的;我宁愿知道问题是什么。
上述代码可能导致奇怪问题的原因有哪些?
为什么第二个示例会产生正确的输出,而第一个示例却没有?
c++ - 为什么在这里使用 static_cast 而不是 reinterpret_cast 很重要?
一位提问者指出
Raymond,我认为 C++ 示例不正确,因为根据 ISO C++ 2003 标准(10-3,第 168 页)未指定派生类中基类子对象的位置,并且您假设基类子对象始终位于开始。C 示例在 C++ 中也可以,所以我会坚持使用它。
Raymond回复了
[代码没有做出这个假设。这就是为什么使用 static_cast 而不是 reinterpret_cast 很重要的原因。试试看:给 OVERLAPPED 添加一个虚拟方法(所以前面有一个 vtable)并观察编译器做了什么。-雷蒙德]
看了他的评论我就猜到了。在示例中使用 static_cast 很好,但 reinterpret_cast 不是。因为 reinterpret_cast 不是转换 vtable。我理解正确吗?
不过,如果我在那里使用 C-Style cast(不是 reinterpret_cast),它也会出错吗?
我重新阅读了更有效的 C++ 的演员解释来理解这一点。但对此没有任何答案。
c++ - 为什么dynamic_cast存在?
我通过这个问题了解了 static_cast 的工作原理。 为什么在这里使用 static_cast 而不是 reinterpret_cast 很重要?
但是如果 static_cast 确实知道类的继承关系,为什么 dynamic_cast 存在?我们什么时候必须使用dynamic_cast?
c++ - 对重载函数的模糊调用
我有两个功能:
现在我想将 '0' 作为 size_t 传递:
编译器抛出错误:“对重载函数的模糊调用”
为了解决这个问题,我可以使用 static_cast,例如:
或者简单:
其中一个比另一个更好吗?有没有其他方法可以解决这个问题?
c++ - 使用 static_cast 实现的转换运算符
在我在这里提出的问题之后,我提出了这个问题。
要点很简单。假设您有两个此类:
然后假设你有一个像这样的类型转换:
问题是:这种转换的标准符合行为应该是什么?
它应该与堆栈溢出相同const T & val(static_cast<const T &> (param) )
还是应该递归迭代?请注意,我获得了使用 GNU 编译的第一个行为g++
和使用 Intel 编译的第二个行为icpc
。
我已经尝试查看标准(关于 static_cast 的第 5.9 节和关于转换的第 12.3 节),但由于缺乏经验,我无法找出答案。
我非常感谢任何花时间帮助我解决这个问题的人。
c++ - 以双精度获取第一个数字并将其存储在 int C++ 中
你好,我在 C++ 中进行编码,我需要一些帮助来将 double 转换为 int。需要一种从双精度即(3.5945)“3”中获取第一个数字的方法。并将该数字放入一个 int 中。
我现在正在使用 static_cast 并且它返回一个 0。
输出....
0 0
c++ - 如何在 C++ 中实现 static_cast
我正在尝试将 GMP 编号库与特征矩阵库一起使用。我尝试实例化模板:
和
其中 mpz_class 是 GMP 库中的数字类。
我得到一个编译器错误:
当我检查 Eigen 库的源代码时,我发现问题是 mpz_class 在这个模板中不能被 static_cast -ed 到 int :
我怎样才能绕过这个问题?我知道如何在运行时将 mpz_class 转换为 int,但它必须由编译器完成,因为 static_cast 是编译时。