gpt4 book ai didi

c++ - 初始值设定项列表是否足够静态以允许实例化模板?

转载 作者:行者123 更新时间:2023-12-03 07:32:31 25 4
gpt4 key购买 nike

对于这个格式错误的问题,我深表歉意。我不知道如何提问。

#include <iostream>

template <int V>
void output() {
std::cout << V << "\n";
}

int main() {

output<1>(); // this works
output<2>();

for (int v : {1,2,3} ) {
output<v>(); // this not
}
return 0;
}

我认为有限次数的迭代足以实例化该模板化函数,但事实并非如此。

有办法让它发挥作用吗?

最佳答案

不,你不能那样做。然而,问题并不在于 std::initializer_list不够恒定。它不起作用,因为你不能拥有 output<>()在循环的每次迭代中更改类型。

初始值设定项列表可以是 constexpr ,以及 constexpr value 可以用作非类型模板参数。例如,这些都有效:

constexpr std::initializer_list<int> x{10, 20};
output<x.size()>();
output<*x.begin()>();
constexpr const int& ref = *x.begin();
output<ref>();

在您的代码中,v不是constexpr 。它在循环的每次迭代中都会发生变化。所以它不能用作非类型模板参数。

总而言之,std::initialier_list<> 、此类列表的大小以及列表的特定元素都足够恒定,可以作为非类型模板参数。对列表中元素的引用(在循环的每次迭代中都会发生变化)不够恒定。

您会发现在循环的每次迭代中发生的变化都不够恒定。以同样的方式,auto旨在在迭代之间更改类型的循环中的变量也是不可能的。

整数常量表达式和类型只能在模板化对象或函数的实例化之间更改。在模板的每次实例化中,它们都有一个针对正在实例化的对象/函数的整个范围的固定值。它们不能在循环迭代之间更改。

关于c++ - 初始值设定项列表是否足够静态以允许实例化模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59508020/

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