我在理解函数,尤其是模板函数和局部变量在编译期间的行为时遇到了麻烦。
因此,下面的代码可以很好地与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
,但我想知道,为什么第二个代码不能工作?
发布于 2019-05-31 03:18:15
这不是一个正式的解释,而是一个(希望)易于理解的理由。
由于C++是一种强类型语言,因此编译器在编译时必须知道std::get
的返回类型。但是不同版本的std::get
会返回不同的类型-因为在不同的索引处,元组中可能有不同的类型。
因此,std::get
的模板参数的值需要来自编译器在编译时已知的某个地方。constexpr变量是具有编译器已知值的东西,以及,例如,用常量表达式初始化的const
变量。但简单的非常数整型变量,即使在定义时初始化,也不是。
https://stackoverflow.com/questions/56384320
复制相似问题