我试图通过使用静态断言禁止创建const MyClass
类型。当一个类被声明为const
时,this
关键字的类型为const MyClass*
,所以我认为这可以工作
class MyClass
{
static_assert(std::is_const_v<std::remove_pointer_t<this>>, "Can't create const MyClass");
}
但是我收到以下错误Cannot substitute template argument this for type template parameter _Ty
为什么我的static_assert
表达式不合法?
答案 0 :(得分:2)
std::remove_pointer_t<>
需要一个类型,但是this
是一个指针,而不是类型。
您需要的是std::is_const_v<std::remove_pointer_t<decltype(this)>>
,但它也无法正常工作,因为您不能在非静态成员函数之外使用this
。
据我所知,没有办法停止创建const限定对象。
答案 1 :(得分:1)
您不能在this
的上下文中使用static_assert
。您可以将其放在虚拟成员函数中,但这不会做您要防止的事情,因为成员函数内部的this
的类型取决于成员的const
限定符功能。
这也是一件很奇怪的事情。我不知道你为什么要这么做。
简单的解决方法是用const
标记零个函数,这样const
对象实际上不能调用任何函数。这不是完美的,但是你做不到。