Я часто использую boost::variant
и хорошо знаком с ним. boost::variant
никак не ограничивает ограниченные типы, в частности, они могут быть ссылками:
#include <boost/variant.hpp>
#include <cassert>
int main() {
int x = 3;
boost::variant<int&, char&> v(x); // v can hold references
boost::get<int>(v) = 4; // manipulate x through v
assert(x == 4);
}
У меня есть реальный вариант использования варианта ссылок для просмотра некоторых других данных.
Затем я был удивлен, обнаружив, что std::variant
не допускает ссылки как ограниченные типы, std::variant<int&, char&>
не компилируется, и здесь явно говорится:
Вариант не может содержать ссылки, массивы или тип void.
Интересно, почему это не разрешено, я не вижу технической причины. Я знаю, что реализации std::variant
и boost::variant
разные, так что, может быть, это связано с этим? Или авторы считают это небезопасным?
PS: я действительно не могу обойти ограничение std::variant
используя std::reference_wrapper
, потому что ссылочная оболочка не позволяет присваивания из базового типа.
#include <variant>
#include <cassert>
#include <functional>
int main() {
using int_ref = std::reference_wrapper<int>;
int x = 3;
std::variant<int_ref> v(std::ref(x)); // v can hold references
static_cast<int&>(std::get<int_ref>(v)) = 4; // manipulate x through v, extra cast needed
assert(x == 4);
}