【问题标题】:Warning: ISO C++ forbids converting a string constant to ‘char*’ for a static `constexpr char*` data member [duplicate]警告:ISO C++ 禁止将静态“constexpr char*”数据成员的字符串常量转换为“char*”[重复]
【发布时间】:2019-06-12 23:17:17
【问题描述】:

为什么这段代码会返回警告

警告: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()    
{};    

如果我在constexpr 之后添加const,警告就消失了:

#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 是否不暗示 conststatic 数据成员?

【问题讨论】:

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


【解决方案1】:

常量指针和指向常量的指针之间通常有区别。通过使您的constexpr char* 成为一个指针本身constexpr(当然还有const),但它仍然试图指向非常量字符 - 这是错误的,因为字符串文字是const .解决方案:

constexpr const char* ch = "StackOverflow!";

其中声明了一个指向constconstexpr 指针。

【讨论】:

  • 我记得规则 const 绑定到其紧邻的事物(除非它的第一个,在这种情况下它绑定到其紧邻的事物)。在我的代码中,我倾向于支持一般情况,而不是括号中的一般规则。 constexpr,当我使用它时(不经常),我总是放在左边作为第一件事。我还没有被OP的情况咬伤。
【解决方案2】:

constexpr 确实暗示了const,但在这种情况下,它将const 应用于“错误的事情”。

constexpr char*

基本一样

char * const

这是一个指向非常量char 的常量指针。这是行不通的,因为字符串文字的类型为 const char[N],所以它会抛弃数组元素的常量。

constexpr const char*

另一方面,基本相同

char const * const

这是一个指向常量char 的常量指针,这是您想要的,因为它保留了元素的常量性。

【讨论】:

    猜你喜欢
    • 2019-10-24
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 2022-01-01
    • 2011-11-20
    • 2012-09-09
    • 1970-01-01
    • 2019-04-14
    相关资源
    最近更新 更多