自c++11以来,自动和解密技术相继问世。
它们是伟大的特征。但也会带来一些头痛。
例如,以下表达式的类型是什么?
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); //???我想知道我们能不能借用一下“覆盖”的概念?实际上,堆栈溢出中存在很多问题,询问解密类型(某些表达式)的类型是什么/为什么?
例如:
autoref ai = ri; //we need a reference
decltype_val(i+j); //we need a value如果我们需要一个值或引用,我们只是明确地向编译器展示我们的想法,这是可能的吗?
发布于 2016-04-22 13:26:11
auto的行为类似于函数模板参数推断:它去掉了const、volatile和引用,并使用了reference collapsing rules。因此:
auto i = x总是一个值;auto &i = x始终是一个值引用;auto &&i = x始终是lvalue或rvalue引用,这取决于x。decltype没有任何推论或类型调整:它总是它的操作数、const和引用的类型等等。它确实有“抓到”的意思:
decltype(x)生成x的确切类型,而decltype((x))生成表达式(x)的类型,该表达式形成对x的引用。发布于 2016-04-22 13:40:47
Auto的行为与模板函数中的类型参数几乎完全一样。
所以
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对应:
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_t或std::decay_t,使其不再是引用,也不适合存储。
未添加新关键字的原因之一是因为每个关键字都有破坏现有代码的风险;关键字不能用作类型名称或变量名。auto是一个过时的关键字,被重新定位,对于decltype,他们仔细搜索可用的代码库,以表明它没有被使用到他们能找到的任何地方。C++标准委员会寻求最小化添加的此类关键字的数量,这是mutable和auto以及typename和template被用于新上下文而不是引入新关键字的原因之一。
顺便说一下,final和override是位置关键字,而不是完全关键字。
https://stackoverflow.com/questions/36794943
复制相似问题