Мне любопытно, почему компилятор не жалуется, если я передаю const-указатель на не-const-указатель в качестве параметра в конструкторе класса, который сам , что, конечно же, при времени строительства не const.const-указатель на не-const-указатель в конструкторе
#include <iostream>
class A
{
public:
A(int* v) : v(v) {}
int* v;
};
class B
{
public:
B() : o(23), v(&o) {}
const A cc() const
{
return A(v); //expected const to non-cosnt error here, but seems valid
}
int o;
int* v;
};
int main() {
B b;
const B* bc = &b;
A a = bc->cc();
*(a.v) = 25; // here I'm changing an originally const value
std::cout << b.o << std::endl;
return 0;
}
с определением CC() как константы я ожидал линию, где возвращаемое значение инициализируется сообщение об ошибке о преобразовании константного к неконстантному. Скомпилированный фрагмент кода прекрасно компилируется, и в конце я получаю вывод «25» даже так, чтобы он был const.
Не возвращайте [const objects] (http://stackoverflow.com/questions/12051012/should-i-return-const-objects) –
И, кстати, вы не передаете указатель на конструктор 'A' где угодно ... –
Память, на которую указывает' v' в 'B', не' const' (и может быть потому, что конструктор, естественно, не является '' const ', где 'o' также не const). Внутри 'cc'' это' const B * ',' o' is 'const int' и' v' is 'int * const'. Члены являются постоянными, но память, на которую указывает 'v', еще не является (будет означать' int const * const'). Однако указатель никогда не изменяется внутри 'cc', а копируется в' A'. – Pixelchemist