如何完善转发成员变量[重复]

问题描述 投票:19回答:3

这个问题在这里已有答案:

请考虑以下代码:

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),但似乎总是产生该成员的基本类型(如结构定义中所定义)。

c++ perfect-forwarding
3个回答
13
投票

会员访问权限是value category preserving。如果对象表达式是左值,则成员访问也是如此,否则它是xvalue(类似于std::move的结果)。因此,对转发对象的结果进行成员访问。

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

13
投票

会员访问在这里做正确的事:你只需要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});
}

5
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.