具有引用有界类型的boost :: variant,无法赋值

时间:2015-03-06 10:33:37

标签: c++11 boost boost-variant

我有一个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错误。

当使用引用而不是指针时,是否有可能使这个功能起作用?

1 个答案:

答案 0 :(得分:2)

变体可以包含引用,但这使它们不可分配。

docs

  • Assignable:当且仅当其每个有界类型符合概念的要求时,variant本身是可分配的。 (请注意,顶级const限定类型和引用类型不符合这些要求。)
  • MoveAssignable:当且仅当其每个有界类型符合概念的要求时,variant本身才是MoveAssignable。 (请注意,顶级const限定类型和引用类型不符合这些要求。)

你仍然可以用它们做有用的事情(例如,返回它们)。参见例如:boost variant copy semantics

相关问题