以下代码编译并打印:move move
. 我宁愿它没有编译,因为它需要右值引用并且merge
我不会移动它。t1
t2
class A {
public:
A() = default;
A(const A& other) { std::cout << "copy "; };
A(A&& other) { std::cout << "move "; };
};
template <typename... TupleType>
auto merge(TupleType&&... tuples) {
return std::tuple_cat(std::move(tuples)...);
}
int main() {
std::tuple<int> t1{1};
std::tuple<A> t2{A()};
auto t3 = merge(t1, t2);
}
我不确定这里发生了什么以及为什么。此外,我认为这种行为是危险的:我在对 的调用中没有移动,merge
但被移动了。t1
t2
为什么这是允许的,我怎样才能merge
只使用右值引用?