无法将模板参数替换为类型模板参数_Ty

时间:2019-07-26 15:52:35

标签: c++ typetraits

我试图通过使用静态断言禁止创建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表达式不合法?

2 个答案:

答案 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对象实际上不能调用任何函数。这不是完美的,但是你做不到。