c++constexpr指针强制转换
c++ constexpr pointer casting
下面的代码解释了问题
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或更小的字符串,这取决于平台,但看起来要好得多。我可以接受这些限制,但有时我想使用库中定义的字符串,所以我不能将"引号"更改为"qoutes"。在上面的例子中,我试图将"abcd"转换为"abcd’。我希望这在内存中有相同的表示形式,所以指针转换看起来是个好主意。但我在编译时无法做到这一点。
因为:
("abcd")[0]
简单地等同于:
'a'
在表达式中得到整体提升:
'a' * 1l
但是像
(reinterpret_cast<const int*>("abcd")
正在尝试获取一个指向静态内存的指针,该指针仅在链接时已知。
相关文章:
- 转换指针引用的字符串
- 无法向上转换指针到指针参数
- 混合转换指针和引用
- 堆栈对象的强制转换指针
- 基类到派生模板类的强制转换指针,而不知道类型
- 删除类型转换指针的最佳方法
- 管理到本机值类转换:强制转换指针是否安全?
- 转换指针类型
- 为什么函数不能正确强制转换指针(从基类到派生类)
- 当我们递增下面的类型转换指针时会发生什么?
- 类型强制转换指针构造函数调用
- 如何转换(指针向量)-->(指向指针数组的指针)
- 如何从类功能转换指针
- 在C++对象中:我应该使用父类强制转换指针,还是应该使用实际类本身进行强制转换
- Delphi中的类型转换指针添加
- C++分段错误(核心转储)错误 - 强制转换指针/将函数值返回到线程
- 以C++和运算符优先级键入指向数组成员的强制转换指针
- C++动态强制转换指针的内存清理
- 转换指针和引用的好处
- 在c++中转换指针