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;
;

当我尝试通过创建 TestVariantvector 并放置 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:递归向量类型的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

通过boost.Variant递归对,因为提升1.62

boost::variant 递归问题

为递归变体编写 boost::variant 访问者

检测 boos::variant 向量内的空指针

将boost变体的向量过滤成新的向量?

如何返回由 boost::variant 返回类型中包含的类型的子集组成的 boost::variant