我可以在对std :: visit

时间:2019-03-15 17:05:24

标签: c++ c++17 std-variant

以下代码是否会调用未定义的行为?

std::variant<A,B> v = ...;

std::visit([&v](auto& e){
  if constexpr (std::is_same_v<std::remove_reference_t<decltype(e)>,A>)
    e.some_modifying_operation_on_A();
  else {
    int i = e.some_accessor_of_B();
    v = some_function_returning_A(i); 
  }
}, v);

尤其是,当变体不包含A时, 此代码重新分配了A,同时仍然保留对先前保存的类型B的引用。 但是,由于分配后不再使用该参考, 我觉得代码很好。 但是,标准库可以免费实现std::visit 以某种方式使上述行为无法确定?

1 个答案:

答案 0 :(得分:17)

代码很好。

std::visit的规范中没有要求访问者不要更改对其调用的任何变体的替代形式。唯一的要求是:

  

要求:对于每个有效包me(m)应该是有效表达式。所有这些表达式应具有相同的类型和值类别;否则,程序格式不正确。

您的访客是每个m的有效表达式,并且始终返回void,因此它满足要求并且行为明确。