我想知道 - 什么是cpp实际的演员结果是什么?具体而言 - 他们的一生是什么时期?
考虑这个例子:
#include <iostream>
#include <stdint.h>
using namespace std;
class Foo
{
public:
Foo(const int8_t & ref)
: _ptr(&ref)
{}
const int8_t & getRef() { return *_ptr; }
private:
const int8_t * _ptr;
};
enum Bar
{
SOME_BAR = 100
};
int main()
{
{
int32_t value = 50;
Foo x(static_cast<int16_t>(value));
std::cout << "casted from int32_t " << x.getRef() << std::endl;
}
{
Bar value = SOME_BAR;
Foo x(static_cast<int16_t>(value));
std::cout << "casted from enum " << x.getRef() << std::endl;
}
return 0;
}
输出:
casted from int32_t 50
casted from enum 100
它有效 - 但是安全吗?使用整数,我可以想象compiller以某种方式向目标变量字节的所需部分投射“指针”。但是当你将int转换为float时会发生什么?
答案 0 :(得分:2)
static_cast
创建一个在表达式生命周期中存在的右值。也就是说,直到分号。见Value Categories。如果需要传递对该值的引用,编译器会将该值放在堆栈上并传递该地址。否则,它可能会保留在寄存器中,尤其是在启用优化的情况下。
您使用它的方式,在您使用它的地方static_cast
是完全安全的。但是,在Foo类中,您正在保存指向右值的指针。程序正确执行只是运气。更复杂的示例可能会将这些堆栈位置重用于其他用途。
编辑详细说明static_cast的安全性。