C++ 无法将此类型模板参数替换为模板参数

C++ 无法将此类型模板参数替换为模板参数,c++,typetraits,C++,Typetraits,我试图禁止使用静态断言创建constmyclass类型。当一个类被声明为const时,this关键字的类型是constmyclass*,所以我认为这会起作用 class MyClass { static_assert(std::is_const_v<std::remove_pointer_t<this>>, "Can't create const MyClass"); } class-MyClass { 静态断言(std::is_const_v,“不能创建con

我试图禁止使用静态断言创建
constmyclass
类型。当一个类被声明为
const
时,
this
关键字的类型是
constmyclass*
,所以我认为这会起作用

class MyClass
{
    static_assert(std::is_const_v<std::remove_pointer_t<this>>, "Can't create const MyClass");
}
class-MyClass
{
静态断言(std::is_const_v,“不能创建const MyClass”);
}
但是,我收到以下错误
无法将此类型模板参数替换为模板参数\u Ty


为什么我的
静态断言
表达式不合法?

静态断言
的上下文中不能使用
。您可以将它放在一个伪成员函数中,但这不会起到您试图阻止的作用,因为成员函数内部的
this
类型取决于成员函数的
const
限定符

这也是一件奇怪的事情。我不知道你为什么要这么做


简单的解决方法是用
const
标记零函数,这样
const
对象实际上就不能调用任何函数。它不是完美的,但你不能做得更好。

std::remove\u pointer\t
需要一个类型,但
这是一个指针,而不是类型

您需要的是
std::is_const_v
,但这不起作用,因为您不能在非静态成员函数之外使用
this


据我所知,没有办法阻止创建const限定对象。

为什么不允许
const Myclass
?我的目标是不允许创建const元素的容器,除非容器声明为const。所以原始代码类似于static_assert(!std::is_const_v | | std::is_const_v,“const元素的容器必须是const”);