gpt4 book ai didi

c++ - 编译器如何评估模板函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:09:14 25 4
gpt4 key购买 nike

考虑以下可变参数模板函数:

template<typename T, typename... Args>
auto foo(Args... args) -> T[sizeof...(args)]
{
T t[sizeof...(args)];
// Maybe do some pack expansion/assignment
return t;
}

实例化:

// total should be of type int[5];
auto total = foo(1,2,3,4,5);

我知道这不会编译,因为返回类型不可推导,但我不明白为什么它不可推导。

关于这个函数,编译器在编译时是否知道/不能知道,或者被评估的函数部分的顺序,这会阻止类型推导?

我怀疑这是由于调用了函数 sizeof...,我认为它是在运行时计算的。如果是这样,是否有编译时等效项?

最佳答案

您不能按值返回内置数组。请改用 std::array

此外,就目前而言,您需要显式提供类型 T 作为模板参数,因为它没有出现在参数列表中。因此,编译器无法从中推断出它。

完整示例:

#include <array>

template<typename T, typename... Args>
auto foo(Args... args) -> std::array<T, sizeof...(args)>
{
std::array<T, sizeof...(args)> t;
// Maybe do some pack expansion/assignment
return t;
}

int main () {
auto a = foo<int>(1,2,3);
}

根据用例,您可以通过例如摆脱显式模板参数使用包中所有元素的 std::common_typestatic_asserting 它们都具有相同的类型并使用它。

此外,根据记录,sizeof... 确实会产生一个编译时常量。问题是,为了明确回答,编译器无法告诉 T 应该是什么。

关于c++ - 编译器如何评估模板函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44720291/

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