如何在constexpr上下文中使用std::array的data及其他成员函数?
问题解决:MSVC下constexpr上下文使用std::array::data()编译错误
问题原因
这是MSVC的编译器实现限制(bug):在consteval函数中返回指向类非静态成员std::array的指针时,编译器无法正确将其识别为合法的常量表达式。相同代码在GCC、Clang中可正常编译,符合C++20及以后的标准规范。
解决方法
方法一:绕过std::array::data(),直接取数组首元素地址
修改Data()函数,直接获取数组首元素的地址替代调用data(),可规避MSVC的识别问题:
consteval auto Data() const -> const char* { return &char_array[0]; }
若需要更严谨的地址获取(避免重载operator&的情况),可使用std::addressof,需包含<memory>头文件:
#include <memory> // ... consteval auto Data() const -> const char* { return std::addressof(char_array.front()); }
方法二:直接存储字符串字面量指针(无需复制内容)
如果你的场景中,ConstexprString的构造参数始终是字符串字面量或具有静态存储期的constexpr字符数组,可以改为直接存储原数组的指针,完全避免std::array的使用,代码更高效:
#include <cstddef> template <std::size_t N> struct ConstexprString { consteval ConstexprString(const char(&_str)[N]) : str_ptr(_str) { } consteval auto Data() const -> const char* { return str_ptr; } private: const char* const str_ptr; };
内容的提问来源于stack exchange,提问作者wangsy
相关产品推荐
相关产品推荐

