gpt4 book ai didi

c++ - 使用 constexpr 数组的元素与 const 数组的元素来实例化模板

转载 作者:搜寻专家 更新时间:2023-10-31 02:22:14 25 4
gpt4 key购买 nike

在回答 a question 时,我遇到了一个我无法解释的问题。

似乎两者之间有足够大的差异

constexpr size_t IntArray[2] = {1, 2};

const size_t IntArray[2] = {1, 2};

第一个元素可用于实例化模板,但第二个元素不能。

演示差异的示例程序。

#include <cstddef>

template <size_t N> struct Foo {};

// Works fine
void test1()
{
constexpr size_t IntArray[2] = {1, 2};
const size_t i = IntArray[0];
Foo<i> f;
(void)f; // Remove unused f warning.
}

// Does not work
void test2()
{
const size_t IntArray[2] = {1, 2};
const size_t i = IntArray[0];
Foo<i> f;
(void)f; // Remove unused f warning.
}

int main()
{
return 0;
}

我在使用 g++ 4.9.2 时遇到以下编译器错误。

g++ -std=c++11 -Wall    socc.cc   -o socc

socc.cc: In function ‘void test2()’:
socc.cc:17:8: error: the value of ‘i’ is not usable in a constant expression
Foo<i> f;
^
socc.cc:16:17: note: ‘i’ was not initialized with a constant expression
const size_t i = IntArray[0];
^
socc.cc:17:9: error: the value of ‘i’ is not usable in a constant expression
Foo<i> f;
^
socc.cc:16:17: note: ‘i’ was not initialized with a constant expression
const size_t i = IntArray[0];
^
socc.cc:17:9: note: in template argument for type ‘long unsigned int’
Foo<i> f;
^
socc.cc:17:12: error: invalid type in declaration before ‘;’ token
Foo<i> f;

我的问题是为什么 constexpr 数组有效,而 const 数组无效?

最佳答案

constexpr 确保该值是编译时值,而 const 仅禁止修改该值。

虽然很容易标记单个 const 变量是否为编译时值,对于 C 数组,需要记住每个索引的信息。

即使我们能做到

const int two = 2;
constexpr int two_bis = two;

以下是不允许的

const size_t IntArray[2] = {1, bar()}; // with non constexpr bar()

constexpr size_t a = intArray[0]; // we might know that is compile time value
constexpr size_t b = intArray[1]; // but this one is clearly not

关于c++ - 使用 constexpr 数组的元素与 const 数组的元素来实例化模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30534332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com