警告:ISO C ++禁止将静态`constexpr char *`数据成员的字符串常量转换为“ char *”

时间:2019-01-18 16:47:33

标签: c++ c++11 static constexpr

为什么此代码返回警告

  

警告:ISO C ++禁止将字符串常量转换为“ char *”   [-Wwrite-strings]

如果

  

在对象声明或非静态中使用的constexpr说明符   成员函数(直到C ++ 14)隐含const。在函数或静态成员变量(自C ++ 17起)的声明中使用的constexpr说明符表示内联。

cppreference.com

#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

2 个答案:

答案 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}}指针。