为什么此代码返回警告
警告:ISO C ++禁止将字符串常量转换为“ char *” [-Wwrite-strings]
如果
在对象声明或非静态中使用的constexpr说明符 成员函数(直到C ++ 14)隐含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
是否暗含const
数据成员上的static
?
答案 0 :(得分:44)
constexpr
确实暗示着const
,但是在这种情况下,它将const
应用于“错误的事物”。
constexpr char*
与
基本相同char * const
是指向非常量char
的常量指针。这是行不通的,因为字符串文字的类型为const char[N]
,所以它将舍弃数组元素的常数。
constexpr const char*
另一方面,基本上与
相同char const * const
这是指向常量char
的常量指针,这是您想要的,因为它保留了元素的常量。
答案 1 :(得分:11)
常量指针和指向常量的指针之间通常存在区别。通过使constexpr char*
成为指针本身就是constexpr
(当然还有const
),但是它仍然试图指向非常量字符-这是错误的,因为字符串文字是const
。解决方案:
constexpr const char* ch = "StackOverflow!";
其中声明了指向constexpr
的{{1}}指针。