【发布时间】:2014-02-25 19:21:51
【问题描述】:
这个问题是对这个问题的后续:Explicit template specialization for templated constructor of templated class 另一个问题中给出的答案当然是正确的,但事实证明我并没有完全问我想问的问题 - 所以这里有一个新问题:
考虑以下代码:
template<typename First, typename ... Rest> class var {
public:
var() {
std::cout << "default" << std::endl;
}
var(const var& v) {
std::cout << "copy" << std::endl;
}
var(var&& v) {
std::cout << "move" << std::endl;
}
template<typename T>
var(const T& t) {
std::cout << "general lvalue" << std::endl;
}
template<typename T>
var(T&& t) {
std::cout << "general rvalue" << std::endl;
}
};
int main()
{
var<int> i0; // expect 'default' -> get 'default'
var<int> i1(i0); // expect 'copy' -> get 'general rvalue'
var<int> i2(std::move(i0)); // expect 'move' -> get 'move'
std::string s("Hello");
var<int> i3(s); // expect 'general lvalue' -> get 'general rvalue'
var<int> i4(std::move(s)); // expect 'general rvalue' -> get 'general rvalue'
}
我在主函数中写了我期望并希望调用的构造函数以及实际调用的构造函数。以下是我的问题:
1) 你能解释一下为什么程序的行为不像我预期的那样吗?
2) 如何让程序在获取 var 时调用 var 的复制和移动构造函数,否则调用模板化构造函数?
3) 最后,我试图将两个模板化构造函数放在一个同时处理左值和右值并使用 std::forward 将它们转发到另一个函数的函数中——这看起来像什么?
【问题讨论】:
标签: c++ templates constructor