gpt4 book ai didi

c++ - 我们需要 std::as_const() 做什么?

转载 作者:IT老高 更新时间:2023-10-28 22:03:43 34 4
gpt4 key购买 nike

C++11 给了我们std::add_const ;使用 C++17,我们有一个新结构 - std::as_const() .前者只是在您提供的类型之前添加一个 const 。第二个是适当的(a 的模板)函数,而不是类型特征,它似乎做同样的事情 - 除了当类型是右值引用时,在这种情况下它不能使用。

我不太明白提供 std::as_const() 的动机。为什么除了 std::add_const 之外我们还需要它?

最佳答案

“需要”是一个强词... std::as_const 存在是因为它有用,而不是绝对必要。由于它是一个函数而不是一个 trait,我们可以使用它来“添加 const”到实际的 values 而不是 types

更具体地说:假设我有一些变量 my_value,我想将其视为 const,但不复制它。在 C++17 之前,我需要编写:

static_cast<const MyType&>(my_value)

如果我不想明确指定类型,那就是:

static_cast
<std::add_const_t<std::remove_reference_t<decltype(my_value)>> &>
(my_value)

或者,如果您想轻松搞定,并使用 C 风格的转换:

(const decltype(my_value) &) (&my_value)

所有这些都很烦人且冗长。

现在用 C++17 代替这些,编写 std::as_const(my_value) 就可以了。

注意事项:

  • 这个函数对右值引用是禁用的,即使它对它们工作得很好。原因是为了帮助您避免无意中保留对暂时过去其破坏的引用。正如@NicolBolas 解释的那样,如果你写这样的东西:

    for(auto &x : std::as_const(returns_container())) { /* do stuff with x */ }

    然后返回的容器的生命周期在循环的第一次迭代之前结束。很容易错过!

  • 有关其他 (?) 信息,请参阅此实用函数的官方提议:P007R1 ,作者:亚当·大卫·艾伦·马丁和阿里斯代尔·梅雷迪思。

关于c++ - 我们需要 std::as_const() 做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53450366/

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