从c ++ 11开始,引入了auto和decltype.
它们是很棒的功能.但它也引入了一些令人头疼的问题.
例如,以下表达式的类型是什么?
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); //???
Run Code Online (Sandbox Code Playgroud)
我想知道我们是否可以借用"覆盖"的想法?实际上stackoverflow中有很多问题询问什么/为什么是decltype的类型(某些表达式)
例如:
autoref ai = ri; //we need a reference
decltype_val(i+j); //we need a value
Run Code Online (Sandbox Code Playgroud)
如果我们需要一个值或引用,我们只是明确地向编译器展示我们的想法,是否可能?
自动行为几乎与模板函数中的推导类型参数完全相同.
所以
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
Run Code Online (Sandbox Code Playgroud)
相当于:
auto t0 = expression;
auto& t1 = expression;
auto const& t2 = expression;
auto&& t3 = expression;
auto const&& t4 = expression;
Run Code Online (Sandbox Code Playgroud)
因为它们的类型t#几乎相同(存在一些细微差别; {}例如,在某些情况下为自动支持).
小心使用,auto可以说"值"或"左值参考"或"我不会修改的参考"或"任何参考".
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得到了以成位置关键字,而不是完整的关键字.
| 归档时间: |
|
| 查看次数: |
82 次 |
| 最近记录: |