【问题标题】:const constexpr char* vs. constexpr char*const constexpr char* 与 constexpr char*
【发布时间】:2023-03-15 10:35:01
【问题描述】:

我知道 const 和 constexpr 之间的区别。一个是编译时常量,另一个是编译时或运行时常量。

但是,对于字符/字符串数组,我很困惑为什么编译器会抱怨一个被使用而不是另一个。

例如我有:

constexpr char* A[2] = {"....", "....."};

const constexpr char* B[2] = {"....", "....."};

通过声明“A”我得到:

ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

但声明“B”时我没有收到任何警告。

为什么额外的 const 限定符会消除警告?无论如何,它们都不是“const char *”吗?我问是因为两者都用constexpr 声明,默认情况下应该使它成为const char*?

我希望 A 没问题:S

【问题讨论】:

  • constexpr 适用于指针,使其成为const,但不适用于它指向的对象。因此,这是您可能需要结合使用 const 和 constexpr 的少数情况之一。
  • constexpr char* 是char* const。 constexpr 说明符适用于对象的整个类型——也就是说,它适用于声明——,const 是一个限定符(属于一种类型)。

标签: c++ c++11


【解决方案1】:

const 告诉编译器不应写入您指向的字符。

constexpr 告诉编译器您存储在这些数组中的指针可以在编译时完全评估。但是,它并没有说明指针指向的字符是否会改变。

顺便说一句,您可以编写此代码的另一种方法是:

const char * const B[2];

第一个const 应用于字符,第二个const 应用于数组本身及其包含的指针。

【讨论】:

  • 我推荐写char const * const B[2];,因为你可以从右到左正确阅读它:A constant pointer to a constant char。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 2019-07-20
  • 1970-01-01
  • 2018-01-01
  • 2015-05-04
  • 2016-07-24
相关资源
最近更新 更多