首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简历.限定符和rvalue.参考

简历.限定符和rvalue.参考
EN

Stack Overflow用户
提问于 2020-07-25 01:27:18
回答 2查看 140关注 0票数 2

假设这段代码如下所示,那么问题是为什么"c“的cv限定符(const)不被保留,其行为与"v”不同?

代码语言:javascript
复制
int main(int argc, char **argv) {
  int x{};
  int y{};
  const auto [v] = std::tuple<int>(x);
  const auto [c] = std::tuple<int&&>(std::move(y));
  decltype(v) vv = 10;  // vv -> const int;
  decltype(c) cc = 100; // cc -> int&&;
  return 0;
}

另外,我可以模仿模板参数演绎的相同类型的演绎过程吗?

代码语言:javascript
复制
template<class T> 
void foo(T t) {  // here should be T rather than universal reference;
  // mimic the same behavior as above somehow ...
}

怀疑2:

对于下面的代码,“结构化绑定”的“自动”推断似乎与“自动”的正常用法不同?

我期望的是,对于第一个"auto",decltype(v)应该是const int的类型,而不是int&类型,因为我没有在"auto“旁边指定"&”。那么,对于带有"auto“的”结构化绑定“,有什么特殊的规则吗?

代码语言:javascript
复制
int main(int argc, char **argv) {
  int x{};
  const auto [v] = std::tuple<int&>(x); // v -> int&;
  static_assert(std::is_same_v<decltype(v), int&>);

  int& rx = x;
  const auto c = rx;  // c -> const int;
  static_assert(std::is_same_v<decltype(c), const int>);

  return 0;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-25 02:52:10

给定的

代码语言:javascript
复制
  const auto [v] = std::tuple<T>(x);

decltype(v)类型为T const,即const-qualified T。如果Tint,那么decltype(v)就是int const (也可以编写const int)。如果Tint&&,那么decltype(v)就是int&& const,它是int&& (而不是const int&&,它是对const int的引用)。类型int&& constint&&相同,因为引用总是有效的const。它们所引用的对象可能是可变的,但是在C++中引用本身是不可变的。

有了没有通用引用的模板类型推断,就我所知,您无法模拟此类型转换(将const添加到T)。但存在一个类型转换性状std::add_const_t<T>

更新疑点2

结构化绑定

代码语言:javascript
复制
const auto [v] = std::tuple<int&>(x); // v -> int&;

不是类似于

代码语言:javascript
复制
int& rx = x;
const auto c = rx;  // c -> const int;

相反,它类似于

代码语言:javascript
复制
const auto e = std::tuple<int&>(x);
auto&& v = std::get<0>(std::move(e));

const限定适用于元组,而不适用于v.引用限定符的约束,或者引用限定符的缺乏适用于元组。V的绑定总是类似于引用。

这种奇怪实际上是另一种情况:

代码语言:javascript
复制
const auto [v] = std::tuple<int>(x);

V仍然是类似引用的,但decltype(v)int。区别在于,结构化绑定中的绑定是别名,而不是引用。它们是所提到的事物的不同名称,但它们本身没有引用类型。

所以:

代码语言:javascript
复制
const auto [v] = std::tuple<T>(x);

最荒谬的是:

代码语言:javascript
复制
const auto e = std::tuple<T>(x);
auto&& r = std::get<0>(std::move(e));
(introduce v as a name for that which r refers to)

第三行不是我们能写的东西。

票数 3
EN

Stack Overflow用户

发布于 2020-07-25 03:30:40

正如杰夫·加雷特所提到的,const将适用于推导出的整个auto类型。例如,如果类型为int&,那么const auto将与auto const相同,后者与int& const相同。引用是const,而不是数据。

现在,你能做些什么?您不必停止使用auto。您可以简单地指定const auto&auto将推断为int,整个类型将是const int& (等效为int const&)。这就是你如何让你的数据成为康斯特。

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

https://stackoverflow.com/questions/63083356

复制
相关文章

相似问题

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