2016-05-11 3 views
0

У меня есть класс с одним членом, который является boost::variant двух типов: vector целых чисел и vector объектов класса (последний, очевидно, должен быть сделано с помощью recursive_wrapper). Код для класса нижеboost :: variant: странное поведение с рекурсивным векторным типом

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

Когда я пытаюсь использовать этот класс, создав vector из TestVariant и emplacing экземпляра рекурсивного экземпляра TestVariant ниже

std::vector<TestVariant> v; 

v.emplace_back(std::vector<TestVariant>{ std::vector<TestVariant>{}, std::vector<int>{} }); // access violation! 

я получаю «доступ нарушение "в MSVS 2013 и Boost ver 1.53 (я знаю, что это старая версия Boost, но на данный момент я органически ограничен ее использованием). Тот же код на coliru отлично работает (см. here).

Что еще более странно, что если я изменить порядок двух векторов, кажется, что все будет в порядке МСВС 2013

std::vector<TestVariant> v; 

v.emplace_back(std::vector<TestVariant>{std::vector<int>{}, std::vector<TestVariant>{} }); // works! 

Любые идеи? Я пытаюсь решить эту проблему в течение дня ...

+1

это Wouldn Не удивительно обнаружить, что есть ошибка MSVS2013 или старая версия boost. Это может быть хорошей возможностью утверждать, что ваша организация должна поступать правильно и обновляться? –

+0

@ RichardHodges Я не мог согласиться больше, но винтики поворачиваются медленно, и в то же время мне нужно обходное решение ... –

+0

Помогло ли решение sehe? Я бы предложил попробовать, но поскольку мне стоило 2 дня, чтобы установить vs2015 на моем компьютере с Windows, я не осмеливаюсь попробовать установить бок о бок. В эти дни, если мне нужно написать код для Windows, я использую clang или Cygwin. Я просто не доверяю Microsoft ... –

ответ

0

Это действительно кажется одной из многих ошибок с одинаковыми списками инициализации/инициализации. Код «отлично» (в том смысле, что это не вызвать UB)

Если это что-то подобное с ошибками я столкнулся, вы могли бы попытаться указать typenames явно:

v.emplace_back(std::vector<TestVariant>{ 
    TestVariant(std::vector<TestVariant>{}), 
    TestVariant(std::vector<int>{}) }); 
+0

Это не работает, к сожалению. –

Смежные вопросы