繁体   English   中英

自动返回类型不推断引用

[英]auto return type not deducing reference

我有以下代码:

#include <iostream>

struct C {
    int a;
    int& get() { return a; }
};
struct D {
    int a;
    int get() { return a; }
};
template <typename T>
auto foo(T o) { // no sample code is complete without a foo
    return o.get();
}

int main()
{
    C c;
    D d;
    c.a = 2;
    d.a = 42; // no sample code is complete without a 42
    std::cout << "c=" << c.a << ", d=" << d.a << "\n";
    c.get() = 3;
    //d.get() = 43;
    std::cout << "c=" << c.a << ", d=" << d.a << "\n";
    foo(c) = 4;  // <--- why won't this work?
    //foo(d) = 44;
    std::cout << "c=" << c.a << ", d=" << d.a << "\n";
}

为什么标记的行不会编译? 似乎copiler正在推断foo<C>的返回类型是int而不是int& I期望的。 为什么会这样,我怎么能得到它来推断出参考呢?

http://coliru.stacked-crooked.com/a/6ab909680836fd24

鉴于auto ,它被声明为非引用,因此我们处理的是pass-by-value案例。 并且auto遵循模板参数推导的规则; int&的引用部分将被忽略,然后推导出的类型为int

您可以使用decltype(auto) (因为C ++ 14)。

type是decltype(e) ,其中e是初始化器。

template <typename T>
decltype(auto) foo(T&& o) { // no sample code is complete without a foo
    return o.get();
}

返回类型推导为decltype(o.get()) ,并根据decltype规则,

如果表达式的值类别是左值,则decltype产生T& ;

c.get()返回int& ,这是一个左值,那么我们得到的返回类型int&的insteand int

顺便说一句:请注意,如果仍然按值传递o ,则返回的引用将被悬空。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM