Должен ли std :: visit работать с классом, производным от std :: option? - PullRequest
5 голосов
/ 26 июня 2019

Это мой код (адаптированный из примера на cppreference ):

#include <iostream>
#include <variant>

class foo : public std::variant<int, float> {
public:
  foo(int v) : std::variant<int,float>(v) {}
  foo(float v) : std::variant<int,float>(v) {}
};

int main() {
  foo v = 5;

  std::visit([](auto &&arg) {
    using T = std::decay_t<decltype(arg)>;
    if constexpr (std::is_same_v<T, int>)
      std::cout << "int: " << arg << std::endl;
    else if constexpr (std::is_same_v<T, float>)
      std::cout << "float: " << arg << std::endl;
  }, v);
}

clang (8.0.0) съедает его и правильно выводит

int: 5

Однако и gcc (9.1.0), и Visual Studio 17 выдают сообщение об ошибке при компиляции.Итак, мой вопрос: является ли этот правильный код в соответствии со спецификацией?

Замена v в вызове на static_cast<std::variant<int, float>>(v) делает все три компилятора успешными для компиляции кода, поэтому главный вопрос заключается в том, должен ли std::visitпринять значение типа, полученного из std::variant.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...