如何解决类为类型名
我正在学习C ++ 14,因为它遇到了此模板变量功能,并且让我感兴趣地对此进行了更多挖掘,并且我尝试了多个示例来理解模板变量。说,
template <typename T>
T var;
var<int>;
var<float>;
以上代码有效,并且看起来也很简单。但是,当我如上所述尝试使用类名代替int或float时,导致为FOO类调用了临时对象创建,而为临时对象调用了相应的C'tor&dtor。
var<FOO>; //FOO is a class
为了您的理解,我编写了一个示例测试程序及其输出。我的问题是,
- 为什么var创建临时对象?
- 原始数据类型和用户定义的数据类型的模板变量有何不同?
如果该内容无关或重复,请指向原始资料以明确了解。
请参考下面的代码
class B
{
public:
B()
{
std::cout<<"\nB ctor"<<std::endl;
}
B(const B& obj)
{
std::cout<<"B copy ctor"<<std::endl;
}
int operator()()
{
std::cout<<"operator() called"<<std::endl;
}
void f() {
//::A().print();
}
~B()
{
std::cout<<"\n~ for B()"<<std::endl;
}
};
//Declaring template variable
template<typename T>
T g ;
int main() {
g<int> = 30;
g<float> = 30.02f;
g<B> = B{};
std::cout<<"g value:"<<g<int><<std::endl;
std::cout<<"g value:"<<g<float>;
}
输出:
B ctor g value:30 g value:30.02 ~ for B()
解决方法
此简单程序不会创建临时对象:
int main() {
var<SomeClass>;
}
在此处创建一个临时对象:
int main() {
var<SomeClass> = SomeClass{};
}
但这是因为我们使用SomeClass{}
做到了。然后,我们将其分配给var<SomeClass>
非临时对象(在您的许多示例中为全局对象)。
在这里运行的代码是
SomeClass::SomeClass()
SomeClass::SomeClass()
SomeClass::operator=(SomeClass&&)
SomeClass::~SomeClass()
SomeClass::~SomeClass()
按此顺序。
#include <iostream>
struct noisy {
noisy() { std::cout << __func__ << "()\n"; }
~noisy() { std::cout << __func__ << "()\n"; }
noisy(noisy&&) { std::cout << __func__ << "(&&)\n"; }
noisy(noisy const&) { std::cout << __func__ << "(c&)\n"; }
void operator=(noisy&&) { std::cout << __func__ << "(&&)\n"; }
void operator=(noisy const&) { std::cout << __func__ << "(c&)\n"; }
};
template<class T>
T var;
int main() {
std::cout << "Start of main\n";
{
var<noisy> = noisy{};
std::cout << "Body of main\n";
}
std::cout << "End of main\n";
}
输出:
noisy() Start of main noisy() operator=(&&) ~noisy() Body of main End of main ~noisy()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。