prvalue表达式的decltype中的cv限定词

时间:2018-12-21 07:08:20

标签: c++ c++11 decltype

在我研究decltype行为及其派生表达类型的规则时出现了这个问题。如果表达式具有prvalue,是否有任何理由不推广常见的cv限定词? 类型。例如:-在下面的代码中,表达式i+j仅由 decltype作为int而不是const int,因为const的性在两个变量中都是相同的,因此它也可以传播到结果表达式中,尽管表达式本身是临时的,并且不是左值,但在类型派生上可能有用(就像单值表达式一样)。

现有规则:如果表达式的值类别为prvalue,则decltype会产生T

#include<iostream>
#include<string>
#include<type_traits>

using namespace std;

int main(int argc, char* argv[])
{
 const int i=10;
 const int j=20;  
 cout << is_same<decltype(i), const int>::value << "," << is_same<decltype(j), const int>::value << endl; 
 cout << is_same<decltype(i+j), const int>::value << "," << is_same<decltype(i+j), int>::value << endl;  
 return(0); 
}

2 个答案:

答案 0 :(得分:3)

根据CPP标准草案n4713:

  

8.2.1值类别[basic.lval]
  ...
  9. ...类prvalue可以具有cv限定的类型;非类prvalue始终具有cv不合格的类型。

由于(i + j)的计算结果为非类prvalue,因此它将具有cv不合格的类型,并在其上使用decltype会产生int

答案 1 :(得分:0)

我认为decltype(i+j)将取决于为operator+i定义j的方式,并且不会基于基于i的任何促销规则和j自己。

关于为什么不是const的原因,我想这将使以后很难进行移动构造/分配,这被认为是重要的优化。