constexpr 和不推荐使用的转换警告

Posted

技术标签:

【中文标题】constexpr 和不推荐使用的转换警告【英文标题】:constexpr and deprecated conversion warning 【发布时间】:2011-03-13 05:04:43 【问题描述】:

我正在编写一个函数作为 Boost.Interprocess 实验的一部分。在函数中,我将字符串文字分配给声明为constexpr char* 的变量。当我这样做时,我得到:

warning: deprecated conversion from string constant to char* [-Wwrite-strings].

我对@9​​87654323@的理解是,在变量声明中,它的行为就好像变量被声明为const,但增加了变量必须初始化的规定,并且初始化必须使用常量表达式。

有了这种理解,我希望constexpr char* 的行为与const char* 一样,因此不会发出警告。我是否错过了 constexpr 的工作原理?

我正在使用 -std=c++0x 编译 GCC 4.6.0 20110306。

我们将不胜感激任何发出警告的理由。谢谢!

【问题讨论】:

【参考方案1】:

来自constexprconst 将使您的变量char* const

您仍然存在字符串文字为 const char 并且允许将其地址转换为 char* 的问题,但已弃用。

【讨论】:

谢谢。我忽略了其他const 的指针。我将声明更改为constexpr const char*,警告消失了。谢谢!【参考方案2】:

另一种解决方案:

而不是-

constexpr char* foo = "bar";

你可以做-

constexpr char foo[] = "bar";

这也将消除警告。

【讨论】:

以上是关于constexpr 和不推荐使用的转换警告的主要内容,如果未能解决你的问题,请参考以下文章

如何摆脱 GCC 中“从字符串常量到‘char*’的不推荐转换”警告?

在非 constexpr 函数上添加的 constexpr 限定符不会触发任何警告

解读C++ constexpr关键字的特性

我们应该尽可能使用 constexpr 吗?

C++ 警告:不推荐使用从字符串常量到“char*”的转换 [-Wwrite-strings]

当值是非常量但使用常量表达式初始化时使用 constexpr?