推导类型 'auto &&' 作为函数 return 类型

Deduced type with 'auto &&' as function return type

在下面的代码片段中,函数 B::f() 是函数 A::f() 的“包装器”。但我假设 A::f() return 类型是一种“不透明”类型,我不知道它是否具有值或引用语义。所以我不能使用 autoconst auto & 作为 B::f() 的 return 类型。我认为 auto && 可以解决问题,但事实并非如此,因为 auto && 被推断为 A::OpaqueType &... 是否可以在这里避免写 A::OpaqueType

#include <iostream>

struct A {
    using OpaqueType=int; // But it could have been `const int &`

    OpaqueType f() const {
        return i;
    }

    int i=42;
};

struct B {
    // how could I use `auto` here to avoid writing the `A::OpaqueType`?
    // I would have expected that `auto &&` would do the trick but it does not
    A::OpaqueType f() const { 
        return a.f();
    }

    A a;
};

int main()
{
    B b;
    std::cout << b.f() << std::endl; 
}

下面的代码片段让我感到困惑,因为我预计 f()g() 的 return 类型会是 int,但它是 int & for f() and int && for g() (我什至不明白为什么不一样)...这怎么解释?

#include <iostream>
 
auto &&f() {
    int i=42;
    return i;
}

struct A {
    int f() {return i;}

    int i=42;
};

auto &&g() {
    A a;
    return a.f();
}

int main()
{
   if (std::is_same_v<decltype(f()), int &>) {
       std::cout << "f() return type is 'int &'\n";
   }
   if (std::is_same_v<decltype(g()), int &&>) {
       std::cout << "g() return type is 'int &&'\n";
   }
}

谢谢!

很确定您要找的是 decltype(auto)。如果 return 语句中的表达式 returns 按值,这将 return 按值,如果 return 语句中的表达式,它将按引用 return returns 参考。那会给你

decltype(auto) f() const { 
    return a.f();
}