Мой вопрос о том, как на самом деле работает этот код:
std::variant<int, std::string> is;
constexpr int i = 0;
std::cout << std::get<i>(is);
И теперь, если я напишу следующий код, он не работает:
std::variant<int, std::string> is;
std::cout << std::get<is.index()>(is);
В документации https://en.cppreference.com/w/cpp/utility/variant/index я обнаружил, что возвращаемый тип индекса — constexpr
. Может кто-то помочь мне с этим?
Обновлять
Теперь, используя std::string_view вместо std::string, который также может быть constexpr, и сделав is
также constexpr. Оно работает. Спасибо
constexpr
не является частью (возвратного) типа. Это спецификатор объявления функции или переменной. - person walnut   schedule 01.11.2019std::cout << v << std::endl;
? Это работает, потому что boost перегружаетoperator<<
для варианта, а не из-за какого-то магического приведения в зависимости от сохраненного типа. - person walnut   schedule 01.11.2019string_view
, но это может быть правдой только в том случае, если вы сделалиis
такжеconstexpr
, и в этом случаеis
станет неизменяемым. С изменяемымis
он не будет работать и сstring_view
. - person walnut   schedule 01.11.2019index()
требуется для возврата константного выражения. Теоретически разработчик библиотеки может, скажем, написатьindex()
таким образом, чтобы это было константное выражение только тогда, когда вариант имеет тип 1, а в противном случае - нет. Это было бы глупо, но стандарт, кажется, позволяет это. Таким образом, вы никогда не можете рассчитывать на то, чтоindex()
можно будет использовать в качестве аргумента шаблона. - person Brian Bi   schedule 01.11.2019