【问题标题】:Why doesn't decltype(auto) return the address of the lvalue?为什么 decltype(auto) 不返回左值的地址?
【发布时间】:2021-10-08 08:51:36
【问题描述】:

我有以下代码

decltype(auto) foo(){
    int a = 10;
    return a;
}

我本来希望 foo 的类型是

int & foo()

因为 a 是一个左值,而 decltype(a) 是一个引用。

如果我做了非常相似的事情,但用完美的转发 lambda 混淆了它,我会得到不同的结果。

// perfect forwarding lambda
auto identity = [](auto&& i) -> decltype(auto) { return std::forward<decltype(i)>(i); };

decltype(auto) foo(){

    int a = 10;
    return identity(a);
}

foo的返回类型变成int&amp;

谁能告诉我这里发生的事情的确切规则?

【问题讨论】:

  • 在没有 identity 函数的情况下,foo 的返回类型是 int,而对于完美的转发 lambda,它是 int &amp;
  • 即使foo 的返回类型是引用,这也会使您返回对局部变量的引用,该变量的生命周期在函数返回时结束,使引用立即无效。
  • decltype 在应用于 id-expression 时具有特殊含义。 Cf.: decltype(x) 和 decltype((x)).
  • decltype(a) 是 int,而不是 int&amp;。要获得int&amp;,您必须将a 括在括号中decltype((a)) 为您提供int&amp;。
  • @bradgonesurfing 对不起,我看错了你的问题。

标签: c++ decltype perfect-forwarding decltype-auto


【解决方案1】:

关键的区别是我写错了恒等函数。

auto identity = [](auto&& i) -> decltype(auto) { 
   return std::forward<decltype(i)>(i); 
};

不一样

template <typename T>
decltype(auto) identity(T && v){
    return std::forward<T>(v);
}

identity 作为 lambda 的正确实现是

auto identity = [](auto&& i) -> decltype(auto) { 
   return std::forward<decltype((i))>(i); 
};

注意双括号decltype((i))

【讨论】:

    猜你喜欢
    • 2021-11-18
    • 2017-03-18
    • 2015-02-17
    • 2014-02-17
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多