这种情况我已经好几次了。也就是说,我设计了一个类,由于不可接受的性能要求,它基本上是不可变的。不可变的意思是它的实例可以在构造时定义并且永远不会修改。实际上,它的所有成员函数都是const
. (好吧,还有一个附带问题,因为它是否仍然可以分配,但让我们继续吧)。
能够强制使用声明实例const
以使意图更加明显会很好。
我不认为 C++ 在不添加间接级别的情况下支持这一点,即通过 const 指针访问对象并禁用直接构造。(或者甚至更好unique_ptr
)。
struct A{ // this class is immutable, so in princple `A a` and `A const a` should behave the same
int f() const{return 5;}
private:
A(){}
public:
template<class... Args>
static A const* make_const(Args&&... args){return new A(std::forward<Args>(args)...);}
};
int main(){
std::unique_ptr<A const> a(A::make_const());
std::cout << a->f() << std::endl;
}
请注意,以下内容不会按预期编译:
A a; // doesn't compile because the constructors are private
也不
std::unique<A> a(A::make_const()); // make creates pointers to const, so this doesn't compile.
只有以下编译,并且您实际上是在强制执行const
:
std::unique_ptr<A const> a(A::make());
std::indirect
可以通过使用http://open-std.org/JTC1/SC22/WG21/docs/papers/2016/p0201r1.pdf使其变得更好,并且在未来重载operator.
也会有所帮助。
当然,更便宜的替代方法是在名称中给出类const
的名称,struct A_const{...
或者struct cA{...
暗示这才const
有意义。(也许,如果你决定以后有变异的成员,你可以从这里继承,struct A : A_const{...
)。