gpt4 book ai didi

c++ - 我可以使用 auto 或 decltype 代替尾随返回类型吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:21:40 27 4
gpt4 key购买 nike

我发现尾随返回类型很容易定义返回复杂类型的函数的返回值,例如:

auto get_diag(int(&ar)[3][3])->int(&)[3]{ // using trailing return type
static int diag[3]{
ar[0][0], ar[1][1], ar[2][2]
};
return diag;
}

auto& get_diag2(int(&ar)[3][3]){ // adding & auto because otherwise it converts the array to pointer
static int diag[3]{
ar[0][0], ar[1][1], ar[2][2]
};
return diag;
}

int main(){

int a[][3]{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};

decltype(get_diag(a)) diag{
get_diag(a)
};

for (auto i : diag)
std::cout << i << ", ";
std::cout << std::endl;

decltype(get_diag2(a)) diag2{
get_diag2(a)
};

for (auto i : diag2)
std::cout << i << ", ";
std::cout << std::endl;


std::cout << std::endl;
}
  • 我想知道函数 get_diagget_diag2 之间有什么区别。所以只要输出相同,为什么我需要使用尾随返回类型?

最佳答案

auto& get_diag2(int(&ar)[3][3]){ // adding & auto because otherwise it converts the array to pointer
static int diag[3]{
ar[0][0], ar[1][1], ar[2][2]
};
return diag;
}

不能在 C++11 编译器中工作。使用不带尾随返回类型的 auto 已添加到 C++14 中,其作用类似于 auto 在将其用于变量时的工作方式。这意味着它永远不会返回引用类型,因此您必须使用 auto& 来返回对您要返回的内容的引用。

如果您不知道应该返回一个引用还是一个值(这种情况在泛型编程中经常发生),那么您可以使用decltyp(auto) 作为返回类型。例如

template<class F, class... Args>
decltype(auto) Example(F func, Args&&... args)
{
return func(std::forward<Args>(args)...);
}

如果 func 按值返回,则按值返回;如果 func 返回引用,则按引用返回。


简而言之,如果您使用的是 C++11,则必须指定返回类型,可以在前面或作为尾随返回类型。在 C++14 及更高版本中,您可以只使用 auto/decltype(auto) 并让编译器为您处理。

关于c++ - 我可以使用 auto 或 decltype 代替尾随返回类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55753000/

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