gpt4 book ai didi

c++ - 函数模板参数和采用 'auto' 的函数参数有什么区别?

转载 作者:行者123 更新时间:2023-12-04 13:27:07 24 4
gpt4 key购买 nike

我看不出这两者之间的区别,有人可以告诉我是否有区别吗?

template <typename Arg1>
void templatedFuncAlsoTakingAutoArg(Arg1 arg1, auto arg2)
{
// Both types are known at compile time for constexpr
static constexpr decltype(arg1) variable1 = decltype(arg1)();
static constexpr decltype(arg2) variable2 = decltype(arg2)();

// And both types work with constexpr if so that invalid code
// can appear within constexpr statements
// If I pass in a double for arg1 or arg2 this still compiles
if constexpr (std::is_integral_v<decltype(arg1)>)
{
arg1.non_existent_member = 7;
}

if constexpr (std::is_integral_v<decltype(arg1)>)
{
arg2.non_existent_member = 7;
}
}
我想知道的基本上是如果它归结为编写一个函数,如果我这样写会有什么不同:
template <typename Arg>
void likeThis(Arg arg){}
或者:
void orLikeThis(auto arg) {}
在模板版本中,您的优势是可以直接引用类型,但在“自动”版本中,您始终可以使用 decltype 获取类型,对吗?那么有什么区别呢?在幕后,无论如何都是采用 auto 实际上是模板的版本,并且以编译器执行模板的相同方式进行实例化?

最佳答案

but in the 'auto' version you can always get the type with decltype anyway, right?


不必要。概念上不会改变任何东西,但 template/ typename版本更灵活一些。
请参阅使用 auto 在 C++14 中引入的通用 lambdas。取而代之的是 template/ typename句法。
在 C++20 中引入了模板 lambda 因为你不能做如下的事情
[]<std::size_t ... Is>(std::index_sequence<Is...>)
{ return (Is + ...); }
(std::make_index_sequence<10u>{});
以一种简单的方式,使用 auto .

关于c++ - 函数模板参数和采用 'auto' 的函数参数有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67711972/

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