如何禁用实例化临时 class?
How to disable instantiating a temporary class?
我正在使用表达式模板 class,不应对其进行实例化以避免引用悬空。但是我很想用 auto 声明一个变量,然后 'auto' 创建一个临时 class.
的命名实例
如何在以下代码中禁用临时 class 的自动声明?
class Base
{
};
class Temp : public Base
{
public:
Temp() {}
Temp(int, int) {}
Temp(const Temp&) = default;
Temp(Temp&&) = default;
};
Temp testFunc(int a, int b) {
return Temp{a,b};
}
int main() {
Base a = testFunc(1,2); // this should work
auto b = testFunc(1,2); // this should fail to compile
return 0;
}
一个选择是将 Temp
的构造函数设为私有,将 testFunc
移到 Temp
class 中并使其成为静态的。这样你仍然可以实例化 Base
,但是 auto
会失败,因为你将调用私有构造函数:
class Base
{
};
class Temp : public Base
{
Temp() {}
Temp(int, int) {}
Temp(const Temp&) = default;
Temp(Temp&&) = default;
public:
static Temp testFunc(int a, int b)
{
return Temp{a,b};
}
};
int main() {
Base a = Temp::testFunc(1,2); // this should work
auto b = Temp::testFunc(1,2); // this should fail to compile
return 0;
}
您似乎想阻止用户对特定类型使用 auto
。这在任何版本的 C++ 中都是不可能的。如果用户编写 T t = <expr>;
是合法的 C++,其中 T
是 <expr>
的类型,那么用户编写 auto t = <expr>;
也是合法的(忽略 class 数据成员)。正如你不能禁止某人使用模板参数推导将 <expr>
传递给模板函数一样。
您为防止 auto
使用所做的任何操作也会禁止该类型的其他使用。
我正在使用表达式模板 class,不应对其进行实例化以避免引用悬空。但是我很想用 auto 声明一个变量,然后 'auto' 创建一个临时 class.
的命名实例如何在以下代码中禁用临时 class 的自动声明?
class Base
{
};
class Temp : public Base
{
public:
Temp() {}
Temp(int, int) {}
Temp(const Temp&) = default;
Temp(Temp&&) = default;
};
Temp testFunc(int a, int b) {
return Temp{a,b};
}
int main() {
Base a = testFunc(1,2); // this should work
auto b = testFunc(1,2); // this should fail to compile
return 0;
}
一个选择是将 Temp
的构造函数设为私有,将 testFunc
移到 Temp
class 中并使其成为静态的。这样你仍然可以实例化 Base
,但是 auto
会失败,因为你将调用私有构造函数:
class Base
{
};
class Temp : public Base
{
Temp() {}
Temp(int, int) {}
Temp(const Temp&) = default;
Temp(Temp&&) = default;
public:
static Temp testFunc(int a, int b)
{
return Temp{a,b};
}
};
int main() {
Base a = Temp::testFunc(1,2); // this should work
auto b = Temp::testFunc(1,2); // this should fail to compile
return 0;
}
您似乎想阻止用户对特定类型使用 auto
。这在任何版本的 C++ 中都是不可能的。如果用户编写 T t = <expr>;
是合法的 C++,其中 T
是 <expr>
的类型,那么用户编写 auto t = <expr>;
也是合法的(忽略 class 数据成员)。正如你不能禁止某人使用模板参数推导将 <expr>
传递给模板函数一样。
您为防止 auto
使用所做的任何操作也会禁止该类型的其他使用。