gpt4 book ai didi

c++ - 为什么 std::get 不适用于变量?

转载 作者:可可西里 更新时间:2023-11-01 17:39:53 25 4
gpt4 key购买 nike

我在理解函数(尤其是模板函数和局部变量)在编译期间的行为时遇到了麻烦。

因此这段代码适用于 std::get :

enum class UserInfoFields{name, email, address};

using UserInfo = std::tuple<std::string, std::string, std::string>;

int main()
{
UserInfo s{"Edmund", "edmund@page.me", "Denver street 19"};
std::cout << std::get<static_cast<size_t>(UserInfoFields::name)>(s) << std::endl;
return 0;
}

据我了解这是因为std::get是一个模板函数,它需要在编译期间知道一个模板参数。这是有道理的 static_cast<...在编译期间给我们值。

我不明白,如果我改变main()代码:

 int main()
{
UserInfo s{"Edmund", "edmund@page.me", "Denver street 19"};
auto a = static_cast<size_t>(UserInfoFields::name);
std::cout << std::get<a>(s) << std::endl;
return 0;
}

这是不允许的。我知道我必须使用 constexpr但我想知道,为什么第二个代码不起作用?

最佳答案

你自己写的

std::get is a template function and it requires a template argument to be known during the compilation

局部变量的值在编译期间不是(在一般情况下)是已知的;局部变量的值是运行时属性。因此,局部变量不能用作模板参数。

如果你想把它作为一个来使用,你必须使它成为一个编译时值。这是通过使其成为 constexpr 来实现的(正如您在问题中所述)。

关于c++ - 为什么 std::get 不适用于变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56384320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com