有关重载->运算符中const关键字的特定placemenet的问题

时间:2018-09-13 09:04:27

标签: c++ overloading

请考虑以下类似类的“智能指针”。它包含一个指向另一个实现了虚拟副本构造函数clone()的类的指针。

我想使operator ->超载。我的资料显示了两个实现,一个const和一个非const的实现-我很好。我知道后者const意味着它无法更改基础字段变量,而前者返回类型为const。但是,返回类型和运算符之间的关键字是什么意思? -即中间一个。

class myClass
{
public:
    myClass(const SomeClass& inner)   {DataPtr = inner.clone();}
    ~MyClass() {delete DataPtr;}
    SomeClass* operator->() {return DataPtr;} 
    const SomeClass* const operator->() const {return DataPtr;}
private:
    SomeClass* DataPtr;
};

2 个答案:

答案 0 :(得分:1)

const SomeClass* const

在这种情况下,const是返回类型的一部分。这可以是有效的C代码。与往常一样,从右到左阅读:

  • const指向const SomeClass实例的指针。

这意味着指针本身是const,并且指针不能通过指针修改。请注意,在您的示例中,最右边的const是无用的,因为您要按值返回:它与返回const int相同。

答案 1 :(得分:1)

  

并且前者返回类型为const

实际上,不。前者(即Jenkins.getInstance()的第一个const)意味着返回类型是指向const的指针。这意味着无法使用指针修改指向的对象。

  

但是返回类型和运算符之间的关键字是什么意思?

它是类型的一部分。

类型名称中的

const始终适用于左侧的内容(除非const是最左侧的标记,在这种情况下,它适用于右侧)。在这种情况下,我们正在考虑的const左侧有一个const SomeClass* const。这意味着指针是const,即指针本身无法修改。

返回非类类型的const值(在这种情况下为const指针)是不明智的,因为constness对程序的行为没有影响。如果这样做,某些编译器将发出警告。我建议删除有问题的const。

即使对于类类型,虽然在某些情况下可能有所不同,但我不知道返回const值的任何实际用例。但是,返回指向const的指针或引用确实有意义。