通过可变参数模板传递右值引用时出现编译器错误
Compiler error when passing rvalue reference through variadic templates
有一项要求,我需要通过可变参数模板将右值从 1 个函数传递到另一个函数。为了避免真正的代码复杂性,下面是使用 int
:
的最小示例
void Third (int&& a)
{}
template<typename... Args>
void Second (Args&&... args) {
Third(args...);
}
void First (int&& a) {
Second(std::move(a)); // error: cannot bind ‘int’ lvalue to ‘int&&’
Third(std::move(a)); // OK
}
int main () {
First(0);
}
First(0)
被正确调用。如果我直接调用 Third(int&&)
,那么使用 std::move()
就可以正常工作。但是调用 Second(Args&&...)
results in:
error: cannot bind ‘int’ lvalue to ‘int&&’
Third(args...); ^
note: initializing argument 1 of ‘void Third(int&&)’
void Third (int&& a)
Second(Args&&...)
编译成功的正确方法是什么?
仅供参考:在实际代码中,Second(Args&&...)
是左值、右值和右值引用的混合。因此,如果我使用:
Third(std::move(args...));
it works。但是当参数混合时,它就会出现问题。
要保持右值性,您必须 move
或 forward
参数
template<typename... intrgs>
void Second (intrgs&&... args) {
Third(std::forward<intrgs>(args)...);
}
你必须使用 std::forward
:
template<typename... intrgs>
void Second (intrgs&&... args) {
Third(std::forward<intrgs>(args)...);
}
有一项要求,我需要通过可变参数模板将右值从 1 个函数传递到另一个函数。为了避免真正的代码复杂性,下面是使用 int
:
void Third (int&& a)
{}
template<typename... Args>
void Second (Args&&... args) {
Third(args...);
}
void First (int&& a) {
Second(std::move(a)); // error: cannot bind ‘int’ lvalue to ‘int&&’
Third(std::move(a)); // OK
}
int main () {
First(0);
}
First(0)
被正确调用。如果我直接调用 Third(int&&)
,那么使用 std::move()
就可以正常工作。但是调用 Second(Args&&...)
results in:
error: cannot bind ‘int’ lvalue to ‘int&&’
Third(args...); ^
note: initializing argument 1 of ‘void Third(int&&)’
void Third (int&& a)
Second(Args&&...)
编译成功的正确方法是什么?
仅供参考:在实际代码中,Second(Args&&...)
是左值、右值和右值引用的混合。因此,如果我使用:
Third(std::move(args...));
it works。但是当参数混合时,它就会出现问题。
要保持右值性,您必须 move
或 forward
参数
template<typename... intrgs>
void Second (intrgs&&... args) {
Third(std::forward<intrgs>(args)...);
}
你必须使用 std::forward
:
template<typename... intrgs>
void Second (intrgs&&... args) {
Third(std::forward<intrgs>(args)...);
}