首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么std::get不能处理变量?

为什么std::get不能处理变量?
EN

Stack Overflow用户
提问于 2019-05-31 03:12:51
回答 1查看 1K关注 0票数 9

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

因此,下面的代码可以很好地与std::get配合使用:

代码语言:javascript
复制
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()代码改成这样:

代码语言:javascript
复制
 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,但我想知道,为什么第二个代码不能工作?

EN

回答 1

Stack Overflow用户

发布于 2019-05-31 03:18:15

这不是一个正式的解释,而是一个(希望)易于理解的理由。

由于C++是一种强类型语言,因此编译器在编译时必须知道std::get的返回类型。但是不同版本的std::get会返回不同的类型-因为在不同的索引处,元组中可能有不同的类型。

因此,std::get的模板参数的值需要来自编译器在编译时已知的某个地方。constexpr变量是具有编译器已知值的东西,以及,例如,用常量表达式初始化的const变量。但简单的非常数整型变量,即使在定义时初始化,也不是。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56384320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档