为什么这段代码会返回警告
警告: ISO C++禁止将字符串常量转换为‘char*’-Wwrite
如果
在对象声明或非静态成员函数(直到C++14)中使用的constexpr说明符意味着const。函数或静态成员变量(因为C++17)声明中使用的constexpr说明符意味着内联。
#include <cassert>
#include <string>
#include <iostream>
struct A
{
// warning: ISO C++ forbids converting a string constant to ‘char*’
static constexpr char* name_ = "A";
static constexpr char* name() { return name_; };
};
int main()
{}; 如果我在const后面添加了一个constexpr,那么警告就消失了:
#include <cassert>
#include <string>
#include <iostream>
struct A
{
static constexpr const char* name_ = "A";
static constexpr const char* name() { return name_; };
};
int main()
{}; 与g++ --version = g++ (GCC) 8.2.1 20181127,
编译g++ -O3 -std=c++2a -Wall main.cpp -o main。
constexpr是否意味着static数据成员上的const?
发布于 2019-01-18 16:52:20
constexpr确实暗示了const,但在这种情况下,它将const应用于“错误的事物”。
constexpr char*基本上和
char * const它是指向非const char的常量指针。这不起作用,因为字符串文本的类型为const char[N],因此它会丢弃数组元素的一致性。
constexpr const char*另一方面,基本上和
char const * const它是一个指向常量char的常量指针,这是您想要的,因为它保持了元素的稳定性。
发布于 2019-01-18 16:50:03
常量指针和指向常量的指针通常是有区别的。通过使您的constexpr char*本身成为一个constexpr (当然还有const),但是它仍然试图指向非const字符,这是错误的,因为字符串文本是const。解决方案:
constexpr const char* ch = "StackOverflow!";它声明了指向constexpr的const指针。
https://stackoverflow.com/questions/54258241
复制相似问题