我只是不知道如何在C ++中编译这个简单的例子:
class C
{
public:
static const void* noop = static_cast<const void*> (0x1);
};
由于我想要的static
存储约束,此处唯一的转换可能是static_cast
,但它与此int-to-ptr转换不兼容。
错误:将类型为'int'的static_cast无效,以输入'const void *'
如何将整数值静态转换为指针类型?
答案 0 :(得分:4)
reinterpret_cast
正在寻找(int
到const 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 ) ;