gpt4 book ai didi

c++ - 从 C++14 开始,尾随返回类型语法的合法使用

转载 作者:可可西里 更新时间:2023-11-01 18:04:49 26 4
gpt4 key购买 nike

实际上是否有任何理由再使用以下语法:

template<typename T>
auto access(T& t, int i)
-> decltype(t[i])
{
return t[i];
}

现在我们可以使用:

template<typename T>
decltype(auto) access(T& t, int i)
{
return t[i];
}

尾随返回类型语法现在看起来有点多余?

最佳答案

推导的返回类型对 SFINAE 不友好。如果 t[i],此重载将简单地退出重载集无效:

template<typename T>
auto access(T& t, int i)
-> decltype(t[i])
{
return t[i];
}

而这种重载不会导致硬错误:

template<typename T>
decltype(auto) access(T& t, int i)
{
return t[i];
}

Demo


此外,您可能会遇到推导返回类型冲突的问题。考虑一下我是否想返回 std::optional<T> .自 std::nullopt_t 后,以下代码无法编译与 std::optional<T> 的类型不同:

#include <optional> // C++17 standard library feature

template <typename T>
auto foo(T const& val)
{
if (val.is_invalid()) return std::nullopt;
return val.some_function_returning_an_optional();
}

尾随返回类型让您可以准确指定要返回的表达式类型:

template <typename T>
auto foo(T const& val)
-> decltype(val.some_function_returning_an_optional())
{
if (val.is_invalid()) return std::nullopt;
return val.some_function_returning_an_optional();
}

您可以使用前导返回类型,但需要使用 std::declval ,这使得它更难理解:

template <typename T>
decltype(std::declval<T const&>().some_function_returning_an_optional())
foo(T const& val)
{
if (val.is_invalid()) return std::nullopt;
return val.some_function_returning_an_optional();
}

Demo

关于c++ - 从 C++14 开始,尾随返回类型语法的合法使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52123331/

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