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;
};