【发布时间】:2021-07-04 11:31:55
【问题描述】:
我正在自己编写“任何”课程。如下代码所示,我有两个问题。
#include <assert.h>
#include <iostream>
#include <typeinfo>
class Test{};
class Any {
public:
template<typename DataType>
explicit Any(DataType&& in) {
Test t;
std::cout
<< typeid(t).name() << " "
<< typeid(in).name() << " "
<< typeid(Test()).name();
std::cout << " move";
}
template<typename DataType>
explicit Any(const DataType& in) {
Test t;
std::cout
<< typeid(t).name() << " "
<< typeid(in).name() << " "
<< typeid(Test()).name();
std::cout << " copy";
}
};
int main()
{
Test t;
Any a(t);
}
编译命令是
g++ main.cpp -std=c++11
输出是
4Test 4Test F4TestvE move
- 为什么 c++ 选择移动构造而不是复制构造? "t" 是 Test 的一个实例,它不是右值。
- 为什么 typeid(in) 和 typeid(Test()) 不一样?它们都是右值。
非常感谢。
【问题讨论】:
-
第一个构造函数有一个“通用引用”(查找它)作为参数,因此它可以接受任何值类别,而您不需要另一个。请注意,这些不是复制/移动构造函数,因为参数类型不是对
Any本身的引用。
标签: c++ copy-constructor move-constructor typeid typeinfo