【发布时间】:2019-06-10 15:07:22
【问题描述】:
我经常使用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&> 无法编译,它明确表示 here:
不允许变量包含引用、数组或 void 类型。
我想知道为什么不允许这样做,我没有看到技术原因。我知道std::variant 和boost::variant 的实现是不同的,所以也许与此有关?还是作者认为它不安全?
PS:我无法真正解决使用std::reference_wrapper 的std::variant 的限制,因为引用包装器不允许从基类型进行赋值。
#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);
}
【问题讨论】:
-
一个演员或
std::get<int_ref>(v).get(),公平地说。 -
你可以使用指针吗?
-
与
optional<T&>相同的问题:您是通过引用分配还是重新安装引用? -
@Galik 在我的应用程序中,我可以让它与指针一起工作,但我必须编写很多额外的代码。我有很多
boost::get调用,如果变体包含完整类型或引用,它们可以无缝工作。它不能与指针无缝地工作。 -
对不起,应该说
boost::get和boost::apply_visitor电话。我可以简单地包装第一个来无缝处理指针,但是包装第二个并不容易。