C++11 通过删除析构函数实现的非不稳定类?
我有一个C++11 通过删除析构函数实现的非不稳定类?,c++11,instantiation,deleted-functions,C++11,Instantiation,Deleted Functions,我有一个类,纯粹用于语法目的,以某种方式调用函数。这是一个简化的示例: #include<iostream> template<class T1> struct make{ template<class T2> static T1 from(T2 const& t2){ return T1{}; //or something more complicated } }; int main(){ doub
类
,纯粹用于语法目的,以某种方式调用函数。这是一个简化的示例:
#include<iostream>
template<class T1>
struct make{
template<class T2>
static T1 from(T2 const& t2){
return T1{}; //or something more complicated
}
};
int main(){
double d = make<double>::from(2);
std::cout << d << '\n';
}
但这仍然是可能的:
make<double> m{}; // valid
make<double> m{}; // valid
这应该足以防止合法C++代码创建该类型的对象。
良好的洞察力,但对于您的代码,仍然允许:<代码> Auto P=新make;,似乎仍然需要删除构造函数(或使其私有)。@alfC:我的意思是包括删除构造函数。这只是一个复制粘贴错误。好吧,一旦构造函数和析构函数被删除或声明为私有,那么将其设置为非agregate会有什么好处?@alfC:不会。只要聚合初始化是可能的,那么也会有什么好处。请注意,该现场演示中的GCC版本不一致,但该标准在这方面非常明确。Clang和VS都编译得很好。此外,如果删除析构函数,则会出现一个奇怪且意外的错误。也就是说,它声称问题在于已删除的析构函数。是的,但用户预期的错误是已删除的构造函数。因此,通过使它不是一个聚合,您也可以改进错误消息。@alfC:“也许我还可以使某些东西成为最终的,以避免继承。”这是毫无意义的,因为即使您确实使某些东西成为基类,您仍然必须构造基类。至于让一些无法识别的。。。一般来说,大多数人并不关心是否实例化一个只包含静态成员的类。这样做不会破坏任何东西。使类不可复制
很有用,因为它可以阻止您执行类无法执行的操作。
template<class T1>
struct make{
~make() = delete;
template<class T2>
static T1 from(T2 const& t2){
return T1{}; //or something more complicated
}
};
#include<iostream>
template<class T1>
struct make{
make() = delete;
~make() = delete;
template<class T2>
static T1 from(T2 const& t2){
return T1{}; //or something more complicated
}
};
int main(){
double d = make<double>::from(2);
std::cout << d << '\n';
make<double> m{}; // compile error (no destructor)
auto p = new make<double>{}; // compile error (no constructor)
}
make<double> m{}; // valid
template<class T1>
struct make{
template<class T2>
static T1 from(T2 const& t2){
return T1{}; //or something more complicated
}
make() = delete;
private:
char c; //Not an aggregate
};
template<class T1>
struct make{
template<class T2>
static T1 from(T2 const& t2){
return T1{}; //or something more complicated
}
make() = delete;
private:
char c; //Not an aggregate
virtual ~make() = default;
};