在我研究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);
}
答案 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
的原因,我想这将使以后很难进行移动构造/分配,这被认为是重要的优化。