나는 순수한 통사 적 목적을 위해 특정 방법으로 함수를 호출하기 위해 사용하는 class
을 가지고있다. 이는 다음과 같은 단순화 된 예입니다.소멸자를 삭제하면 실천할 수없는 수업이 생깁니 까?
#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';
}
이제이 클래스를 인스턴스화하면 안됨을 사용자에게 경고하려고한다고 가정합니다. 수업을 견딜 수있는 용도가있을 수 있지만 그게 가능하지 않으면 호기심이 있습니까?
먼저 나는 기본 생성자
template<class T1>
struct make{
make() = delete;
template<class T2>
static T1 from(T2 const& t2){
return T1{}; //or something more complicated
}
};
을 삭제하려하지만이 여전히 가능 : 마지막으로
make<double> m{}; // valid
, 내가 소멸자를 삭제 시도하고 그
template<class T1>
struct make{
~make() = delete;
template<class T2>
static T1 from(T2 const& t2){
return T1{}; //or something more complicated
}
};
작업 듯
하지만 클래스는 여전히 0으로 할당 될 수 있습니다..
나는 소멸자 및 삭제 생성자, (어떤 사본에 대한 및 생성자를 이동?)
이 인스턴스화를 허용하는 가장 좋은 방법 모두를 삭제해야 하는가? 여기 코드 : http://coliru.stacked-crooked.com/a/0299c377c129fffb
#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)
}
좋은 통찰력을 가지고 있지만, 코드는 여전히 허용됩니다 :'auto p = new make;', 생성자를 삭제 (또는 비공개)해야합니다. –
alfC
@alfC : 나는 구조물을 삭제하는 것을 의미했습니다.그것은 단지 복사 및 붙여 넣기 오류 일뿐입니다. –
ok, 일단 생성자와 소멸자가 삭제되거나 비공개로 선언되면 무의미한 상태로 만들면 어떻게 될까요? – alfC