gpt4 book ai didi

c++ - 为什么 decltype(auto) 不能按预期工作?

转载 作者:搜寻专家 更新时间:2023-10-31 02:04:18 24 4
gpt4 key购买 nike

#include <type_traits>
#include <utility>

int main()
{
auto f1 = [](auto&& e) -> auto
{
return e;
};

auto f2 = [](auto&& e) -> auto&
{
return e;
};

auto f3 = [](auto&& e) -> auto&&
{
return e;
};

auto f4 = [](auto&& e) -> decltype(auto)
{
return e;
};

int n{};

f1(std::move(n)); // ok
f2(std::move(n)); // ok
f3(std::move(n)); // ok
f4(std::move(n)); // error
}

clang的报错信息:

error : rvalue reference to type 'int' cannot bind to lvalue of type 'int'

对我来说,decltype(auto) 只有三种可能的推导类型:

  1. 自动
  2. 自动&
  3. 自动&&

为什么是f4错误,而其他三个都正常?

最佳答案

这是一个GCC bug .

decltype(auto) = e 等同于 decltype(e) 并产生 e 的声明类型。

auto 用作模板参数,这意味着 auto&& 与发明模板参数的 T&&(转发引用)相同。

对于f1,返回类型被推断为int

对于 f2 返回类型 auto& 等同于 T& 推导 T=int 是类型左值 e 的值,在这里您将 int& 绑定(bind)到 e

对于 f3 考虑这个:

auto&& t = n;
static_assert(std::is_same_v<decltype(t), int&>); // true

对于 f3 的返回,auto&& 等同于发明的模板参数 T&&,它是一个转发引用,它用一个初始化左值,使用推导的 T=int 产生 T&,然后再次...将 int& 绑定(bind)到左值 e

现在对于 f4 考虑一下:

int&& r = 9;
static_assert(std::is_same_v<decltype(r), int&&>); // true (1)

decltype(auto) t = r; // fail with the same error you got.

f4 的参数也是一个转发引用T&&,用赋值std::move(n)初始化,这推导T=int 产生参数 int&& e。返回类型为 decltype(auto)return e 意味着实际返回是 decltype(e),然后如您所见 (1 ) 是真的,同样适用于 decltype(e),这意味着 f4 的实际返回是 int&& ...问题,f4 试图将右值 int&& 绑定(bind)到左值 e,这是被禁止的。

你也可以看看@StoryTeller's answer对于 GCC 错误。

关于c++ - 为什么 decltype(auto) 不能按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53717911/

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