gpt4 book ai didi

c++ - 使用衰减与完美转发

转载 作者:行者123 更新时间:2023-12-01 15:08:19 29 4
gpt4 key购买 nike

假设我们有两个功能:

template <typename T> void callDecayExample1(T& t)
{
std::initializer_list<T> testList2{ 1, 2, 3 };
}

template <typename T> void callDecayExample2(T&& t)
{
std::initializer_list<std::decay_t<T>> testList{1, 2, 3};
}

我们这样称呼他们:
const int& i = 2;
int j = 10;
int& ref_j = j;

callDecayExample1(i); // deduced as const int&
callDecayExample1(ref_j);// deduced as int&
callDecayExample1(j); // deduced as int&

callDecayExample2(i); // deduced as const int&
callDecayExample2(ref_j);// deduced as int&
callDecayExample2(j); // deduced as int&

尽管两个函数都有类似的推论,但是在第二个函数中,我必须使用std::decay_t来编译应用程序。为什么会这样呢?

我将Visual Studio 2019与/ std:c++ 17标志一起使用

最佳答案

当你有一个像

template <typename T> void callDecayExample1(T& t)
{
std::initializer_list<T> testList2{ 1, 2, 3 };
}

那么 T只会被推导出为非引用类型。如果给它一个 int&,则 T变为 int,因此 t成为 int&。因此,您不需要使用 decay


template <typename T> void callDecayExample2(T&& t)
{
std::initializer_list<std::decay_t<T>> testList{1, 2, 3};
}

如果传递 int&,则 T被推导为 int&,然后引用折叠规则将 int& &&转换为 int&以获得 t的类型。这意味着,如果没有 decay,您将尝试制作无法做到的 std::initializer_list<int&>

关于c++ - 使用衰减与完美转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59426374/

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