C++ 如何完善前向成员变量

C++ 如何完善前向成员变量,c++,perfect-forwarding,C++,Perfect Forwarding,考虑以下代码: 模板void foo(T&&some_结构) { bar(std::forward(某些结构成员)); } 在转发整个结构的情况下,我将执行std::forward(some_struct)。但是在转发成员时如何获得正确的类型 我的一个想法是使用decltype(some_struct.member),但这似乎总是产生该成员的基本类型(如结构定义中所定义的)。成员访问在这里做的事情是正确的:您只需要std::forward(some_struct.member) 通过以下方式进

考虑以下代码:

模板void foo(T&&some_结构)
{
bar(std::forward(某些结构成员));
}
在转发整个结构的情况下,我将执行
std::forward(some_struct)
。但是在转发成员时如何获得正确的类型


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

成员访问在这里做的事情是正确的:您只需要
std::forward(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});
}
模板
结构检查;
结构Foo{
int i;
};
模板
空心钢筋(T&f){
//致命错误:未定义模板“检查”的隐式实例化
检查{};
}
int main(){
巴(富{42});
}
会员访问权限不可用。如果对象表达式是左值,那么成员访问也是左值,否则它是xvalue(就像
std::move
的结果一样)。成员访问转发对象的结果也是如此

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

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

template <typename T>
void foo(T&& some_struct) {
    bar(std::forward<decltype(std::declval<T>().member)>(some_struct.member));
}
模板
void foo(T&&some_结构){
bar(std::forward(某些结构成员));
}
在这段代码中,被转发的实际对象是成员而不是对象。 由于转发只是一种有条件的移动,您可能需要看以下两篇文章:

我喜欢你链接的两篇文章。然而,我并不真正理解其余答案的要点。这似乎与Louis Dionne的文章相矛盾,因为如果
member
是一个引用,那么您可能不应该从该成员处移动。@Justin您是绝对正确的,您不应该这样做,但是如果该成员不是共享对象,移动它是完全安全的(请阅读第一篇文章)。这段代码可能解决了他的问题“但是转发成员时如何获得正确的类型?”。我把这两篇文章联系起来,指向提问者,这样做是不安全的。