为什么 std::get<T> 其中 T 是调用 constexpr 函数失败的结果?

Why std::get<T> where T is the result of call a constexpr function fails?

本文关键字:失败 函数 constexpr 结果 调用 gt get std lt 为什么 其中      更新时间:2023-10-16

我的问题是这个代码实际上是如何工作的:

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值调用constexpr方法,则该方法可以返回constexpr值。

所以你必须将is定义为constexpr

constexpr std::variant<int, std::string> is;

不幸的是,当if不是文字类型时,std::variant不能被声明为constexpr,所以当它的一个类型(如std::string(不是文字时。

但有效,例如

constexpr std::variant<int, long> is;

模板参数值必须在编译时已知。

std::variant<int, std::string> is;
constexpr int i = 0;
std::cout << std::get<i>(is);

这是因为i的值是用constexpr声明的,因此在编译时是已知的,所以您实际上是在调用std::get<0>(is)

std::variant<int, std::string> is;
std::cout << std::get<is.index()>(is);

这是因为is没有用constexpr声明,因此is.index()返回的值在运行时之前是未知的,因此不能在模板参数中使用。