我有一个boost :: variant:B是一个不完整的类型所以我有两种可能性来声明我的变体
typedef boost::variant<B*, char, int> vari; // this works
typedef boost::variant<B&, char, int> vari; // this works also
但现在我有以下功能,我尝试为我的变体赋值:
void setVari(vari& v, const int n){
swich(n) {
case 1 :
vari = 100;
break;
case 2 :
vari = 'a'
break;
case 3 : {
B elem;
vari = elem; // or "vari = *elem" if i use the pointer variant
break;
}
case default :
break;
}
}
此功能仅在我使用第一种方法声明我的变体时才有效。
如果我使用参考内容,编译器会抱怨template argument deduction/substituiion failed
错误。
当使用引用而不是指针时,是否有可能使这个功能起作用?
答案 0 :(得分:2)
变体可以包含引用,但这使它们不可分配。
docs:
Assignable
:当且仅当其每个有界类型符合概念的要求时,variant本身是可分配的。 (请注意,顶级const限定类型和引用类型不符合这些要求。)MoveAssignable
:当且仅当其每个有界类型符合概念的要求时,variant本身才是MoveAssignable。 (请注意,顶级const限定类型和引用类型不符合这些要求。)你仍然可以用它们做有用的事情(例如,返回它们)。参见例如:boost variant copy semantics