当没有非const运算符重载时,非const对象会使用const运算符吗?

时间:2016-03-04 14:51:13

标签: c++

似乎是VS2013。但为什么在有效的c ++'第3项,非const运算符在执行完全相同的操作时调用const运算符?

这是Effective c ++第3项中的代码:

class TextBlock {
public:
...
const char& operator[](std::size_t position) const // same as before
{
...
...
...
return text[position];
}
char& operator[](std::size_t position) // now just calls const op[]
{
return const_cast<char&>( // cast away const on type;
static_cast<const TextBlock&>(*this)[position]  // add const to *this's type;call const version of op[]
);
}
...
};

3 个答案:

答案 0 :(得分:2)

const对象无法使用非const方法。 (请记住,运算符只是方法)。

但是相反的 是真的:非const对象可以使用const方法(尽管它会使用非{如果存在,则等效{1}}。

方法只有const ,如果标记为const:编译器允许断言const - 检查功能机构。

答案 1 :(得分:2)

是:如果存在const成员函数,但没有非const版本,则在非const对象上调用该函数将使用const功能

#include <iostream>

struct Foo {
    void bar() const { std::cout << "const bar()\n"; }
};

int main() {
    Foo f;
    f.bar();
}

打印const bar()

注意反面是为真。您可以const对象上调用非const成员函数:

struct Foo {
    void bar() { std::cout << "non-const bar()\n"; }
};

int main() {
    const Foo f;
    f.bar();
}

给出编译器错误:

SO.cpp: In function 'int main()':
SO.cpp:9:11: error: passing 'const Foo' as 'this' argument of 'void Foo::bar()' discards qualifiers [-fpermissive]
     f.bar();
           ^

EC ++第3项,尽可能使用const 有一个小节,避免const和非const成员函数中的重复。它表明你不只是让编译器选择const版本的原因是返回类型是不同的(由const) - 非 - {{ 1}}版本将其抛弃:

const

答案 2 :(得分:1)

请注意,它调用const运算符,强制转换constness (这是少数几次不会导致UB的情况之一)。这是必需的,因此非const运算符返回可变引用。否则,您将无法修改向量中包含的对象。

调用现有的运算符而不是再次编写代码是为了避免代码重复以及更改一个函数时可能出现的错误,但忘记了另一个函数。

关于你的评论:没有涉及的举动。它返回引用。我希望const和非const运算符的生成代码没有区别。