gpt4 book ai didi

c++ - 可以在 C++14 constexpr 函数中使用 for 循环实例化模板吗?

转载 作者:IT老高 更新时间:2023-10-28 22:21:46 25 4
gpt4 key购买 nike

我一直在使用 SVN 构建的 clang 来试验 constexpr 的宽松规则。 .到目前为止,我还无法确定的一件事是,是否可以在编译时在 constexpr 函数中循环遍历元组内的元素。

因为我没有 C++14 兼容的标准库可供测试,所以我准备了以下等效测试:

template<int N>
constexpr int foo() {
return N;
}

constexpr int getSum() {
auto sum = 0;
for (auto i = 0; i < 10; ++i) {
sum += foo<i>();
}
return sum;
}

constexpr auto sum = getSum();

这里有趣的部分是foo<i>() .在非 constexpr 函数中,我希望它无法编译,因为您根本无法使用运行时 int 来生成模板的编译时实例化。因为这是一个 constexpr功能,但是,我质疑这是否可能。特别是,该值在编译时是已知的,即使它被允许改变。

我知道下面的代码编译:

constexpr auto nValue = 2;
foo<nValue>();

在 SVN clang 中,我的第一个示例没有:

test2.cpp:19:12: error: no matching function for call to 'foo'    sum += foo();           ^~~~~~test2.cpp:11:15: note: candidate template ignored: invalid explicitly-specified      argument for template parameter 'N'constexpr int foo() {              ^

对于初学者,我很难解释此错误消息的第二部分。除此之外,它是由 C++14 标准规定的吗?如果是这样,有谁知道为什么不允许这种语法(简单的监督或防止某些事情发生)?

最佳答案

That aside, is it mandated by the C++14 standard, and if so, does anyone know why this syntax wouldn't be allowed (simple oversight or to protect against something)?

这是因为 constexpr 不是编译时计算或使用所独有的。 constexpr 函数就是这样,允许在常量表达式中使用函数(或变量)。除此之外,它们是常规功能。在某些情况下,例如 static_assert 或数组大小等仅在编译时的情况下,恰好需要一个常量表达式。

您会注意到在您的代码中循环了一个变量,但您循环的变量本身不是 constexpr 因此它不是在该模板中使用的常量表达式N 的实例化。就目前而言,这与在 C++11 中执行此操作没有什么不同:

constexpr bool f(int x) {
static_assert(x > 10, "..."); // invalid
return true;
}

这显然是无效的,因为正如我之前提到的,您不必在独占编译时情况下使用 constexpr 函数。例如,没有什么能阻止你这样做:

constexpr int times_ten(int x) {
return x * 10;
}

int main() {
int a = times_ten(20); // notice, not constexpr
static_assert(times_ten(20) == 200, "...");
static_assert(a == 200, "..."); // doesn't compile
}

关于c++ - 可以在 C++14 constexpr 函数中使用 for 循环实例化模板吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20436611/

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