Продолжается дискуссия о том, что делать optional
и variant
со ссылочными типами, особенно в отношении присвоения. Я хотел бы лучше понять дискуссию по этому вопросу.
optional<T&> opt;
opt = i;
opt = j; // should this rebind or do i=j?
В настоящее время решение состоит в том, чтобы сделать optional<T&>
плохо сформированным и сделать variant::operator=
плохо сформированным, если какой-либо из типов является ссылочным типом - чтобы обойти аргумент и предоставить нам большую часть функциональности.
Каков аргумент, что opt = j
должен перепроверять базовую ссылку? Другими словами, зачем нам реализовывать optional
следующим образом:
template <class T>
struct optional<T&> {
T* ptr = nullptr;
optional& operator=(T& rhs) {
ptr = &rhs;
return *this;
}
};