c ++ static_cast结果的生命周期

时间:2014-07-23 05:51:07

标签: c++ casting

我想知道 - 什么是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时会发生什么?

1 个答案:

答案 0 :(得分:2)

static_cast创建一个在表达式生命周期中存在的右值。也就是说,直到分号。见Value Categories。如果需要传递对该值的引用,编译器会将该值放在堆栈上并传递该地址。否则,它可能会保留在寄存器中,尤其是在启用优化的情况下。

您使用它的方式,在您使用它的地方static_cast是完全安全的。但是,在Foo类中,您正在保存指向右值的指针。程序正确执行只是运气。更复杂的示例可能会将这些堆栈位置重用于其他用途。

编辑详细说明static_cast的安全性。