如何完善转发一个成员变量

How to perfect forward a member variable

考虑以下代码:

template<typename T> void foo(T&& some_struct)
{
    bar(std::forward</* what to put here? */>(some_struct.member));
}

在转发整个结构的情况下,我会做 std::forward<T>(some_struct)。但是转发会员时如何获取正确的类型呢?

我的一个想法是使用 decltype(some_struct.member),但这似乎总是产生该成员的基类型(如结构定义中所定义)。

成员访问在这里做正确的事情:你只需要 std::forward<T>(some_struct).member.

测试:

template <class... >
struct check;

struct Foo {
    int i;
};

template <class T>
void bar(T &&f) {
    // fatal error: implicit instantiation of undefined template 'check<int &&>'
    check<decltype((std::forward<T>(f).i))>{};
}

int main() {
    bar(Foo{42});
}

成员访问权限为 value category preserving。如果对象表达式是一个左值,那么成员访问也是一个左值,否则它是一个 xvalue(如 std::move 的结果)。转发对象的结果也是成员访问。

std::forward<T>(some_struct).member

正如@StoryTeller 所解释的那样,如果您转发结构,那么成员值类别将被保留(我认为记住这一点很重要)。 但是转发成员时如何获取正确的类型呢? 你可以这样做:

template <typename T>
void foo(T&& some_struct) {
    bar(std::forward<decltype(std::declval<T>().member)>(some_struct.member));
}

在此代码中,转发的实际对象是成员而不是对象。 由于转发是有条件的举动,您可能需要看看这两篇文章: enter link description here enter link description here