我试着包装一些类似于Qt的共享数据指针,以达到我的目的,并且在测试后,我发现当const函数应该被调用时,它的非const版本是改为选择。调用一个const函数而不是它的非const版本
我用的C++ 0x编译选项,这里是一个很小的代码:
struct Data {
int x() const {
return 1;
}
};
template <class T>
struct container
{
container() {
ptr = new T();
}
T & operator*() {
puts("non const data ptr");
return *ptr;
}
T * operator->() {
puts("non const data ptr");
return ptr;
}
const T & operator*() const {
puts("const data ptr");
return *ptr;
}
const T * operator->() const {
puts("const data ptr");
return ptr;
}
T* ptr;
};
typedef container<Data> testType;
void testing() {
testType test;
test->x();
}
正如你所看到的,Data.x是一个const功能,使操作者 - >叫应常量之一。当我注释掉非const函数的时候,它编译没有错误,所以它是可能的。然而,我的终端打印:
“非const的数据PTR”
它是一个GCC的bug(我有4.5.2),或者是有什么我失踪?
所以如果对象没有声明为const,编译器会更喜欢调用非const重载,即使它可以调用const重载? – coyotte508
@ coyotte508:正确。非'const'超载被认为是更好的匹配。 –