助推变种在 1_54 中被破坏



我认为 Boost::variant 在 1_54 中被破坏了。我正在尝试使用 std::unique_ptr 作为提升变体中的有界类型。

根据 1_54 文档,变体需要可复制可构造或移动可构造。

http://www.boost.org/doc/libs/1_54_0/doc/html/variant/reference.html

所以我实现了移动构造函数并在代码中禁用了复制构造函数。

当我尝试为变体对象分配某些内容时,它无法编译。我已经尝试了各种不同的方法,包括使用 std::move 将数据分配给变体对象,但似乎没有任何效果。在编译错误堆栈跟踪之后,我确定问题出在 variant.hpp 中,它试图备份 rhs 数据。我想知道你们的想法,并让我知道我是否正确地假设 boost 变体文档是错误的。

提前谢谢。

我正在使用 vs2010 编译并使用 C++11。

这是我的测试代码:

#include <iostream>
#include <memory>
#include <utility>
#include <vector>
#include <string>

#pragma warning (push)
#pragma warning (disable: 4127 4244 4265 4503 4512 4640 6011)
#include <boost/optional.hpp>
#include <boost/variant.hpp>
#include <boost/ref.hpp>
#include <boost/shared_ptr.hpp>
#pragma warning (pop)
#include <boost/foreach.hpp>
#include <boost/format.hpp>
using boost::format;
using boost::str;
using namespace std;
class UniqueTest
{
};
class Foo
{
  public:
  std::unique_ptr<UniqueTest> testUniquePtr;
     Foo()      { std::cout << "Foo::Foon";  }
     Foo (Foo&& moveData)
     {
     }               
     Foo& operator=(Foo&& moveData)
     {
     return *this;
     }
  private:
     Foo(Foo& tt);
     Foo& operator=(const Foo& tt);
};

int main()
{
  Foo x = Foo();
  boost::variant<std::wstring,Foo> m_result2;
     std::wstring  testString = L"asdf";
  m_result2 = testString; //Fails
  //m_result2 = std::move(testString); //Fails
  //m_result2 = std::move(x); //Fails
  boost::get<Foo>(m_result2).testUniquePtr.get ();
  return 0;
}

我的代码是否为任何人编译?

不,它没有,变体将尝试调用缺少的复制构造函数。 (Foo::Foo(Foo const&)甚至没有声明):

boost/variant/variant.hpp|756 col 9| error: no matching function for call to ‘Foo::Foo(const Foo&)’

即使你声明了它,它也不起作用:

test.cpp|43 col 6| error: ‘Foo::Foo(const Foo&)’ is private

评论中已经提到过,但你需要

    使复制构造函数
  • 成为复制构造函数(用于良好的样式)

    Foo(Foo const& tt) = delete;
    Foo& operator=(const Foo& tt) = delete;
    
  • 使移动构造函数/赋值noexcept,否则(像std::vector一样)variant将拒绝移动东西,因为它不是异常安全的。

    Foo(Foo && moveData) noexcept { }    
    Foo& operator=(Foo && moveData) noexcept { return *this; }
    

下面是一个在 GCC 和 Clang 上编译的简化示例:

#include <iostream>
#include <memory>
#include <string>
#include <boost/variant.hpp>
struct UniqueTest { };
struct Foo
{
public:
    std::unique_ptr<UniqueTest> testUniquePtr;
    Foo() { std::cout << "Foo::Foon"; }
    Foo(Foo && moveData) noexcept { }
    Foo& operator=(Foo && moveData) noexcept { return *this; }
    Foo(Foo const& tt) = delete;
    Foo& operator=(const Foo& tt) = delete;
};

int main()
{
    Foo x = Foo();
    boost::variant<std::wstring, Foo> m_result2;
    std::wstring  testString = L"asdf";
    m_result2 = testString; //Fails
    //m_result2 = std::move(testString); //Fails
    //m_result2 = std::move(x); //Fails
    boost::get<Foo>(m_result2).testUniquePtr.get();
}

相关内容

  • 没有找到相关文章

最新更新