似乎很明显constexpr意味着const,因此通常会看到:
constexpr int foo = 42; // no const here
但是如果你写:
constexpr char *const str = "foo";
然后GCC将产生"警告:不推荐将字符串常量转换为'char *'"如果传递-Wwrite-string标志。
写作:
constexpr const char *const str = "foo";
解决了这个问题。
constexpr const和constexpr真的一样吗?
答案 0 :(得分:57)
问题在于,在变量声明中,constexpr
始终将const
- ness应用于声明的对象;另一方面,const
可以应用于其他类型,具体取决于展示位置。
因此
constexpr const int i = 3;
constexpr int i = 3;
是等价的;
constexpr char* p = nullptr;
constexpr char* const p = nullptr;
是等价的;将p
const
指向char
。
constexpr const char* p = nullptr;
constexpr const char* const p = nullptr;
是等价的。 constexpr
使p
成为const
指针。 const
中的const char *
使p
指向const char
。
答案 1 :(得分:3)
您看到的错误消息与constexpr
关键字本身无关。
字符串文字,如" foo",如:
somefunction("foo");
此字符串文字的类型为const char *
。以下声明:
char *const str = "foo";
这会尝试将const char *
值分配给char *
值。生成的char *
值不可变,不变,但到那时错误已经发生:尝试将const char *
转换为char *
。
示例中的constexpr
关键字只是一种分心,与错误无关。
答案 2 :(得分:-1)
<强> 号。要说它们是相同的意味着在没有为const版本生成功能相同的代码的情况下,没有时间不使用const是有效的。
我发现这对于创造安全的单身人士很有用。我没有完全探讨过这个问题,并且期望非const constexpr还有其他有效用途。
举个例子,这里是需要的代码非const constexpr:
从变量的全局定义开始:
int global_int_;
现在我们可以创建一个constexpr函数来返回对它的引用:
constexpr int& get_global()
{
return global_int_;
}
现在我们可以在其他地方使用该引用:
int main()
{
constexpr int& i{ get_global() };
// do stuff with i
return 0;
}
我们现在可以使用i
作为非const int。如果暗示了const,那就不可能了。
由于非const constexpr有效,如果您使用的是需要为const的constexpr,则需要明确声明它。