以下代码解释了问题
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;。我希望它在内存中具有相同的表示,因此指针转换看起来是个好主意。但是我无法在编译时这样做。
答案 0 :(得分:2)
因为像:
("abcd")[0]
简单地等同于:
'a'
在表达式中获得整数提升:
'a' * 1l
但事情如下:
(reinterpret_cast<const int*>("abcd")
正在尝试获取指向静态内存的指针,该指针仅在链接时已知。