为什么在模板参数为非 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'};
,它将调用您的类型的默认构造函数之一(也许是聚合初始化?我不太清楚)然后初始化你的 variant
和 A
.
对于 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'};
,它将调用您的类型的默认构造函数之一(也许是聚合初始化?我不太清楚)然后初始化你的 variant
和 A
.