首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不向C++引入autoval/autoref或decltype_val/decltype_ref?

为什么不向C++引入autoval/autoref或decltype_val/decltype_ref?
EN

Stack Overflow用户
提问于 2016-04-22 13:18:13
回答 2查看 94关注 0票数 0

自c++11以来,自动和解密技术相继问世。

它们是伟大的特征。但也会带来一些头痛。

例如,以下表达式的类型是什么?

代码语言:javascript
复制
int i = 10, j = 20;
int &ri = i;
auto ai = ri; //what is the type of ai? int or int &

decltype(i);   
decltype((i)); //???
decltype(i+j); //???

我想知道我们能不能借用一下“覆盖”的概念?实际上,堆栈溢出中存在很多问题,询问解密类型(某些表达式)的类型是什么/为什么?

例如:

代码语言:javascript
复制
autoref ai = ri;   //we need a reference
decltype_val(i+j); //we need a value

如果我们需要一个值或引用,我们只是明确地向编译器展示我们的想法,这是可能的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-22 13:26:11

auto的行为类似于函数模板参数推断:它去掉了constvolatile和引用,并使用了reference collapsing rules。因此:

  • auto i = x总是一个值;
  • auto &i = x始终是一个值引用;
  • auto &&i = x始终是lvalue或rvalue引用,这取决于x

decltype没有任何推论或类型调整:它总是它的操作数、const和引用的类型等等。它确实有“抓到”的意思:

  • decltype(x)生成x的确切类型,而
  • decltype((x))生成表达式(x)的类型,该表达式形成对x的引用。
票数 4
EN

Stack Overflow用户

发布于 2016-04-22 13:40:47

Auto的行为与模板函数中的类型参数几乎完全一样。

所以

代码语言:javascript
复制
template<class T>void foo0(T t0);
template<class T>void foo1(T& t1);
template<class T>void foo2(T const& t2);
template<class T>void foo3(T&& t3);
template<class T>void foo4(T const&& t4);

foo#(expression); // pseudo code on this line

对应:

代码语言:javascript
复制
auto t0 = expression;
auto& t1 = expression;
auto const& t2 = expression;
auto&& t3 = expression;
auto const&& t4 = expression;

在这种情况下,t#的类型几乎是相同的(有一些细微的差异;例如,auto在某些情况下支持{} )。

仔细使用auto可以让您说“值”或“lvalue引用”或“我不会修改的引用”或“任何引用”。

decltype也有自己的怪癖。如果传递变量的名称,它将返回该变量被声明为的类型。否则,如果传递一个表达式,它将返回表达式的类型。

这意味着decltype((x))x是一个变量是表达式(x)的类型,而decltype(x)是变量x的类型(它被声明为-- decl aration 类型)。

通常,您可以将类型操作助手应用于decltype的返回值,例如std::remove_reference_tstd::decay_t,使其不再是引用,也不适合存储。

未添加新关键字的原因之一是因为每个关键字都有破坏现有代码的风险;关键字不能用作类型名称或变量名。auto是一个过时的关键字,被重新定位,对于decltype,他们仔细搜索可用的代码库,以表明它没有被使用到他们能找到的任何地方。C++标准委员会寻求最小化添加的此类关键字的数量,这是mutableauto以及typenametemplate被用于新上下文而不是引入新关键字的原因之一。

顺便说一下,finaloverride是位置关键字,而不是完全关键字。

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

https://stackoverflow.com/questions/36794943

复制
相关文章

相似问题

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