STL
充满了像这样的定义:
iterator begin ();
const_iterator begin () const;
由于返回值不参与重载决议,这里唯一的区别在于函数是const
。这是否是重载机制的一部分?编译器解决类似以下代码行的算法是什么:
vector<int>::const_iterator it = myvector.begin();
STL
充满了像这样的定义:
iterator begin ();
const_iterator begin () const;
由于返回值不参与重载决议,这里唯一的区别在于函数是const
。这是否是重载机制的一部分?编译器解决类似以下代码行的算法是什么:
vector<int>::const_iterator it = myvector.begin();
在你提供的例子中:
vector<int>::const_iterator it = myvector.begin();
如果 myvector
不是 const 的,那么将调用非 const 版本的 begin()
,并且会依赖于从迭代器到 const_iterator 的隐式转换。
是的,const
修饰符会影响重载。如果此时myvector
是const
,那么将调用const
版本:
void stuff( const vector<int>& myvector )
{
vector<int>::const_iterator it = myvector.begin(); //const version will be called
}
vector<int> myvector;
vector<int>::const_iterator it = myvector.begin(); //non-const version will be called
根据C++标准(§13.3.1候选函数和参数列表):
对于非静态成员函数,隐式对象参数的类型为“引用cv X”,其中X是函数所属的类,cv是成员函数声明中的cv限定符。[例如:对于类X的const成员函数,假定额外的参数具有类型“对const X的引用”。]
因此,在您的情况下,如果myvector
对象是const
,编译器将选择具有隐式对象参数类型为reference to const vector
的begin
版本,这是begin
的const版本。
值得一提的是,C++允许常量方法/函数重载(例如,foo() const),但不允许常量参数重载(例如,bar(int a)和bar(const int a))。
class C {
public:
int f() { return 1; }
float f() const { return 1.5; }
};
// Non const.
C c;
assert(c.f() == 1);
// Convert variable const at compile time.
assert(const_cast<const C&>(c).f() == 1.5);
// Same as above but with an explicit reference.
const C& d = c;
assert(d.f() == 1.5);
// Analogous but with a new const object from the start.
const C e;
assert(d.f() == 1.5);