c ++ constexpr指针转换

时间:2015-12-31 08:34:23

标签: c++ c++11 constexpr

以下代码解释了问题

constexpr int x = *(reinterpret_cast<const int*>("abcd")); //wrong
constexpr int y = ("abcd")[0]*1l + ("abcd")[1]*256l + ("abcd")[2]*256*256l + ("abcd")[3]*256*256*256l; //ok

如何在constexpr表达式中进行此类型转换?

更新

这样做的原因:

我正在编写一组模板,用于在编译时操作c风格的字符串。它使用字符串的这种表示形式:

template<char... args> struct String {static const char data[sizeof...(args)+1];};
template<char... args> constexpr const char String<args...>::data[sizeof...(args)+1] = {args...,0};

所以在我的程序中我可以这样做:

String<'H','e','l','l','o',' ','w','o','r','l','d','!'>

但我不能这样做:

String<"Hello world!">

我有一个短暂的部分解决方案:

template<int N,char... chrs> struct Int2String : Int2String<(N>>8),N,chrs...> {};
template<char... chrs> struct Int2String<0,chrs...> : String<chrs...> {};
...
Int2String<'Hell'>

它使用c多字符文字,因此只适用于长度为4或更短的字符串,取决于平台,但看起来要好得多。我对这个限制很满意,但有时我想使用在库中定义的字符串,所以我无法改变#34;引用&#39; qoutes。在上面的示例中,我尝试转换&#34; abcd&#34;到了abcd&#39;。我希望它在内存中具有相同的表示,因此指针转换看起来是个好主意。但是我无法在编译时这样做。

1 个答案:

答案 0 :(得分:2)

因为像:

("abcd")[0]

简单地等同于:

'a'

在表达式中获得整数提升:

'a' * 1l

但事情如下:

(reinterpret_cast<const int*>("abcd")

正在尝试获取指向静态内存的指针,该指针仅在链接时已知。