C++: const constructor

ppplva

Субж не существует. Но очень хочется. А значит, его нужно придумать.
Более формально: хочется в конструкторе отличить конструирование константного объекта от неконстантного.
По this не получается - внутри конструктора он non-const.
Любые методы, вызываемые из конструктора, вызываются в неконстантном варианте (если такой есть).
google рассказывает только про старую багу в gcc (он в определенных ситуациях ругался на отсутствие такого конструктора )
Есть идеи ?

freezer

Более формально: хочется в конструкторе отличить конструирование константного объекта от неконстантного.

Анахуа?
можно так:


static struct UseConstConstructorType {} UseConstConstructor;
class MyClass
{
public:
MyClass {...}
MyClass(const UseConstConstructorType&) {...} // const version
MyClass(int n) {...}
MyClass(int n, const UseConstConstructorType&) {...} // const version
};
// usage:
void main
{
MyClass x, y(5);
const MyClass cx(UseConstConstructor cy(5, UseConstConstructor);
}

ppplva

> Анахуа?
Хочется, чтобы константный объект отличался от неконстантного по внутреннему представлению.
> можно так
Нет, так некруто. Ты ему сам рассказываешь, константный он или нет.
Нужна прозрачность.
Скажем так:
class A {
private:
bool is_const;
...
};
Нужно, чтобы на протяжении всего времени жизни объекта значение is_const соответствовало истине (const_cast не учитываем ).

freezer

никак не получится. Конструктор делает не переменную, а как бы значение... чему это значение будет присвоено, какой переменной (или м.б. вообще ничему) - это ты никак не определишь. Тут тебе даже RTTI не поможет.
То что ты хочешь - это все равно что перегрузить функцию по типу результата, что как известно невозможно
Оставить комментарий
Имя или ник:
Комментарий: