constexpr const vs constexpr变量?

时间:2015-03-04 01:13:55

标签: c++ c++11 gcc const constexpr

似乎很明显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真的一样吗?

3 个答案:

答案 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,则需要明确声明它。