为什么在模板参数为非 POD 时 boost 变体抛出异常?

why boost variant throw exception when template argument is non-POD?

对于 POD 甚至 std::string boost 变体都适用于我,但是当我尝试我的用户类型 A 时,它因以下代码而失败:

#include "stdafx.h"
#include <boost/variant/variant.hpp>
#include <boost/variant/get.hpp>

struct A
{
  char ch;
};

int main()
{
  boost::variant< int, A > n, a;
  n = 33;
  a = 'a';

  try
  {
    int nn = boost::get< int >( n ); // ok
    auto aa = boost::get< A >( a ); // throws bad_get
  }
  catch( boost::bad_get& )
  {
    bool okay = false;
  }

  return 0;
}

这是为什么?

您的第二个示例实际上包含另一个 int,因为 char 可以转换为 int。要从 char 构造一个 A ,您可以执行 a = A{'a'}; ,它将调用您的类型的默认构造函数之一(也许是聚合初始化?我不太清楚)然后初始化你的 variantA.