警告:ISO C++ 禁止将字符串常量转换为静态“constexpr char*”数据成员的“char*”
Warning: ISO C++ forbids converting a string constant to ‘char*’ for a static `constexpr char*` data member
为什么这段代码 return 是警告
warning: ISO C++ forbids converting a string constant to ‘char*’
[-Wwrite-strings]
如果
A constexpr specifier used in an object declaration or non-static
member function (until C++14) implies const. A constexpr specifier used in a function or static member variable (since C++17) declaration implies inline.
#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
不意味着 const
在 static
数据成员上吗?
常量指针和指向常量的指针之间通常存在差异。通过使你的 constexpr char*
你使指针本身成为 constexpr
(当然,const
),但它仍然试图指向非常量字符 - 这是错误的,因为字符串文字是 const
。解决方案:
constexpr const char* ch = "Whosebug!";
它声明了一个指向 const
的 constexpr
指针。
constexpr
确实意味着 const
,但在这种情况下,它将 const
应用于 "wrong thing"。
constexpr char*
与
基本相同
char * const
这是指向非常量 char
的常量指针。这是行不通的,因为字符串文字的类型是 const char[N]
,所以它会抛弃数组元素的常量性。
constexpr const char*
另一方面,与
基本相同
char const * const
这是一个指向常量 char
的常量指针,这正是您想要的,因为它保留了元素的常量性。
为什么这段代码 return 是警告
warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
如果
A constexpr specifier used in an object declaration or non-static member function (until C++14) implies const. A constexpr specifier used in a function or static member variable (since C++17) declaration implies inline.
#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
不意味着 const
在 static
数据成员上吗?
常量指针和指向常量的指针之间通常存在差异。通过使你的 constexpr char*
你使指针本身成为 constexpr
(当然,const
),但它仍然试图指向非常量字符 - 这是错误的,因为字符串文字是 const
。解决方案:
constexpr const char* ch = "Whosebug!";
它声明了一个指向 const
的 constexpr
指针。
constexpr
确实意味着 const
,但在这种情况下,它将 const
应用于 "wrong thing"。
constexpr char*
与
基本相同char * const
这是指向非常量 char
的常量指针。这是行不通的,因为字符串文字的类型是 const char[N]
,所以它会抛弃数组元素的常量性。
constexpr const char*
另一方面,与
基本相同char const * const
这是一个指向常量 char
的常量指针,这正是您想要的,因为它保留了元素的常量性。