boost::variant:递归向量类型的奇怪行为
Posted
技术标签:
【中文标题】boost::variant:递归向量类型的奇怪行为【英文标题】:boost::variant: strange behaviour with a recursive vector type 【发布时间】:2016-05-11 17:21:02 【问题描述】:我有一个具有单个成员的类,它是两种类型的 boost::variant
:整数的 vector
和包含类对象的 vector
(后者显然需要在 @ 的帮助下完成987654325@)。该类的代码如下
#include <boost/variant/variant.hpp>
#include <boost/variant/recursive_wrapper.hpp>
#include <vector>
class TestVariant
public:
typedef boost::variant< std::vector<int>, boost::recursive_wrapper<std::vector<TestVariant> > > StorageType;
TestVariant():
m_value std::vector<int>
TestVariant(const TestVariant& other):
m_value other.m_value
TestVariant& operator=(const TestVariant& other)
m_value = other.m_value;
return *this;
TestVariant(TestVariant&& other):
m_value std::move(other.m_value)
TestVariant& operator=(TestVariant&& other)
m_value = std::move(other.m_value);
return *this;
TestVariant(const std::vector<int>& value):
m_value value
TestVariant(std::vector<int>&& value):
m_value std::move(value)
TestVariant(const std::vector<TestVariant>& value):
m_value value
TestVariant(std::vector<TestVariant>&& value):
m_value std::move(value)
private:
StorageType m_value;
;
当我尝试通过创建 TestVariant
的 vector
并放置 TestVariant 的递归实例的实例来使用此类时,如下所示
std::vector<TestVariant> v;
v.emplace_back(std::vector<TestVariant> std::vector<TestVariant>, std::vector<int> ); // access violation!
我在 MSVS 2013 和 Boost 版本 1.53 下遇到“访问冲突”异常(我知道这是 Boost 的旧版本,但我目前在组织上受限于使用它)。 coliru 上的相同代码可以正常工作(请参阅here)。
更奇怪的是,如果我切换两个向量的顺序,在 MSVS 2013 中似乎一切都很好
std::vector<TestVariant> v;
v.emplace_back(std::vector<TestVariant>std::vector<int>, std::vector<TestVariant> ); // works!
有什么想法吗?我已经尝试解决这个问题一天了...
【问题讨论】:
在MSVS2013或旧版本的boost中发现有bug并不稀奇。这可能是证明您的组织应该做正确的事情并进行升级的好机会? @RichardHodges 我完全同意,但齿轮转动得很慢,与此同时,我确实需要一个解决方法...... sehe 的解决方案有帮助吗?我愿意尝试一下,但由于在我的 Windows 计算机上安装 vs2015 花了我 2 天的时间,我不敢尝试并排安装。现在,如果我需要为 Windows 编写代码,我会使用 clang 或 Cygwin。我只是不信任微软...... 【参考方案1】:这确实似乎是统一初始化/初始化器列表的许多错误之一。代码“很好”(在某种意义上不会触发 UB)
如果它与我遇到的错误类似,您可以尝试明确指定类型名称:
v.emplace_back(std::vector<TestVariant>
TestVariant(std::vector<TestVariant>),
TestVariant(std::vector<int>) );
【讨论】:
以上是关于boost::variant:递归向量类型的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章