mic*_*mic 20 c++ perfect-forwarding
请考虑以下代码:
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),但似乎总是产生该成员的基本类型(如结构定义中所定义).
Que*_*tin 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});
}
Sto*_*ica 13
成员访问权限是保留值类别.如果对象表达式是左值,则成员访问也是如此,否则它是xvalue(就像结果一样std::move).因此,对转发对象的结果进行成员访问.
std::forward<T>(some_struct).member
小智 5
正如@StoryTeller所解释的,如果转发结构,则将保留成员值类别(我谨记这一点很重要)。但是,转发成员时如何获得正确的类型?您可以执行以下操作:
template <typename T>
void foo(T&& some_struct) {
    bar(std::forward<decltype(std::declval<T>().member)>(some_struct.member));
}
在此代码中,要转发的实际对象是成员而不是对象。由于转发只是有条件的举动,因此您可能需要看这两篇文章: 在此处 输入链接描述在此处输入链接描述
| 归档时间: | 
 | 
| 查看次数: | 1086 次 | 
| 最近记录: |