constexpr const vs constexpr变量?

Tho*_*ard 39 c++ gcc const constexpr c++11

很明显constexpr意味着const,因此常见的是:

constexpr int foo = 42; // no const here
Run Code Online (Sandbox Code Playgroud)

但是,如果你写:

constexpr char *const str = "foo";
Run Code Online (Sandbox Code Playgroud)

然后,如果传递了-Wwrite-string标志,GCC将产生"警告:从字符串常量弃用转换为'char*'".

写作:

constexpr const char *const str = "foo";
Run Code Online (Sandbox Code Playgroud)

解决了这个问题.

那么constexpr const和constexpr真的一样吗?

T.C*_*.C. 66

问题是在变量声明中,constexpr始终将const-ness 应用于声明的对象; const另一方面,取决于位置,可以应用于不同类型.

从而

constexpr const int i = 3;
constexpr int i = 3;
Run Code Online (Sandbox Code Playgroud)

是等价的;

constexpr char* p = nullptr;
constexpr char* const p = nullptr;
Run Code Online (Sandbox Code Playgroud)

是等价的; 既能使p一个const指针char.

constexpr const char* p = nullptr;
constexpr const char* const p = nullptr;
Run Code Online (Sandbox Code Playgroud)

是等价的.constexprp一个const指针.将constconst char *使p指向const char.

  • 不,它们不一样。`constexpr const char* p = nullptr;` 声明 p 是一个指向 const char 数据的 const 指针,因此 p 及其指向的数据都不能被修改。`constexpr char* p = nullptr;` 声明 p 是一个指向 char 数据的 const 指针,因此 p 不能修改,但 p 指向的数据可以修改。 (4认同)

Sam*_*hik 5

您看到的错误消息与constexpr关键字本身无关。

像“foo”这样的字符串文字,如下所示:

somefunction("foo");
Run Code Online (Sandbox Code Playgroud)

此字符串文字的类型是const char *. 以下声明:

char *const str = "foo";
Run Code Online (Sandbox Code Playgroud)

这会尝试为一个const char *值分配一个char *值。结果char *值是不可变的、常量,但到那时错误已经发生:尝试将 a 转换const char *为 a char *

constexpr您示例中的关键字只是一种干扰,与错误无关。

  • 不。constexpr 附加到被声明的对象。被声明的对象不是指针指向的单个字符,而是指针本身。 (3认同)
  • `"foo"` 的类型是 `const char [4]`。 (2认同)