静态地将整数转换为指针类型

时间:2014-06-24 23:09:47

标签: c++ pointers c++11 type-conversion

我只是不知道如何在C ++中编译这个简单的例子:

class C
{
  public:
    static const void* noop = static_cast<const void*> (0x1);
};

由于我想要的static存储约束,此处唯一的转换可能是static_cast,但它与此int-to-ptr转换不兼容。

  

错误:将类型为'int'的static_cast无效,以输入'const void *'

如何将整数值静态转换为指针类型?

4 个答案:

答案 0 :(得分:4)

reinterpret_cast正在寻找(intconst void*指针的字节的原始解释)

此外,您需要constexpr进行静态数据成员的类内初始化:

class C
{
  public:
    static constexpr const void* noop = reinterpret_cast<const void*>(0x1);
};

static_cast不起作用,因为没有用户定义或隐式转化的组合可以将int转换为const void*

修改

此解决方案不是标准C ++(常量表达式中不允许reinterpret_cast),40 solution是正确的。

答案 1 :(得分:4)

这里的问题是,虽然您声明const void* const限定符不适用于指针而是指向此指针指向的地址。

这意味着noop不是static const成员变量,因为需要在const static以外的单个翻译单元中定义和初始化所有非class成员变量定义如下例:

class C {
  public:
    static const void *noop;
};

const void* C::noop = (const void*) 0x1;

<强> Live Demo

以下解决方案:

class C {
public:
  static constexpr const void* noop = reinterpret_cast<const void*>(0x1);
};

虽然,它在GCC中编译和工作正常是无效的C ++(例如,它不能用clang或VC ++ 2013编译)因为根据标准§5.19/ 2常量表达式[expr .const] reinterpret_cast的结果不能是常量表达式。

答案 2 :(得分:1)

40两个已经修复了编译错误,但也使成员非const,这是不合需要的,因为它阻碍了优化并且突然发生意外突变。

最佳:

class C {
  public:
    static const void* const noop;
};

const void* const C::noop = reinterpret_cast<const void*>(0x1);

答案 3 :(得分:0)

另一个解决方案也来自问题 40两个引用:constexpr and initialization of a static const void pointer with reinterpret cast, which compiler is right?,是使用intptr_t,它是:

  

能够持有指针的整数类型

这也允许您将成员变量设为constexpr

class C
{
  public:
    static constexpr intptr_t noop = 0x1 ;
};

然后你可以在使用它的地方使用 reinterpret_cast

const void * vPtr = reinterpret_cast<void*>( C::noop ) ;