【发布时间】:2020-11-13 16:10:26
【问题描述】:
以下代码编译并打印: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 只接受右值引用?
【问题讨论】:
-
@alterigel 答案应该属于答案框!
标签: c++ c++17 variadic-templates rvalue-reference fold-expression