似乎是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[]
);
}
...
};
答案 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运算符的生成代码没有区别。