- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
decltype(1+2) 是否声明了一个 xvalue 或 prvalue?
cppreference 说,decltype(expression) 将声明:1. T&& if expression 是一个xvalue2. T 如果表达式是纯右值3. T& 如果表达式是左值
但我的问题是:如何生成一个作为 xvalue 的表达式?我想返回值和临时对象应该是 xvalue,但实际上它们似乎是 xvalue,在我的实验中:
struct S{};
S f();
int main()
{
int i=2;
decltype(i+1) j=i;
++j;
printf("i=%d\n",i);
S obj;
decltype(f()) k=obj;
return 0;
}
这个程序编译:我可以判断
decltype(i+1) declares (i+1) as a prvalue
因为如果它是一个 xvalue,那么 decltype 得到 T&&,它不能绑定(bind)到“i”的左值变量。 decltype(f()) 也给我 f() 作为纯右值也很奇怪?
所以我的问题是:如何编写表达式以便 decltype(expression) 给我一个 xvalue?谢谢。
最佳答案
Decltype 解析为一个类型,而不是一个表达式——你不能说它“声明一个纯右值”或类似的东西。
i+1
是纯右值,而不是 id 表达式。所以 decltype
产生一个非引用类型:decltype(i+1) j = i;
表示 int j = i;
。
第二种情况类似; f()
是纯右值,所以 decltype(f())
是 S
。
要使 decltype(expression)
解析为右值引用类型,表达式必须是一个 xvalue。例如 decltype( std::move(f()) )
是 S&&
。
关于C++11: "decltype(1+2)"声明了一个 xvalue 还是一个 prvalue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43444178/
[N4687] 3.9 [defns.dynamic.type] dynamic type 〈glvalue〉 type of the most derived object (4.5) to whi
我的代码如下: #include #include int main(){ for(int& v : std::vector{1,3,5,10}) { std::cout
我最近一直在仔细研究 C++ 类别。 lvalue 和 rvalue 之间的区别似乎很清楚,但是当谈到 prvalue 和 xvalue 时,我感到困惑。 给出下面的例子: #include usi
根据 this博客——我意识到这是旧的,如果它不再被认为是相关的,请告诉我——实现二元运算符的最佳方法如下... // The "usual implementation" Matrix operat
在 C++11 5.1 Primary Expressions 中声明: The type of [an id-expression] is the type of the identifier. T
对于这个问题的广泛性,我很抱歉,只是所有这些细节都是紧密相关的.. 我一直在努力理解具体两个值类别(xvalues 和 prvalues)之间的区别,但我仍然感到困惑。 无论如何,我试图为自己建立的关
有没有办法定义一个只处理 xvalue 或 prvalue 的函数(或者这里是异或)? 例如,假设我有一个方法 f(foo&& f),我如何声明 f 绑定(bind) xvalue 类型并拒绝 prv
几个星期以来,我一直在仔细研究右值和右值引用。我越来越有信心,我对以下两者之间的区别有了一定的了解: 定义变量或函数参数的类型(即 int x; 与 int && x = …; 表达式的表达式类别,包
这个问题是在我研究 decltype 行为及其派生表达式类型的规则时提出的。如果表达式是纯右值,是否有任何理由不提升通用 cv 限定符?类型。例如:- 在下面的代码中,表达式 i+j 是由declty
C++标准定义删除了以下函数; template void ref(const T&&) = delete; template void cref(const T&&) = delete; 这是为
What are rvalues, lvalues, xvalues, glvalues, and prvalues?很好地概述了右值/左值的分类,最近对该问题的回答之一 (https://stack
在 C++03 中,表达式可以是 rvalue 或 lvalue。 在 C++11 中,表达式可以是: 右值 左值 xvalue glvalue prvalue 两个类别变成了五个类别。 这些新的表达
decltype(1+2) 是否声明了一个 xvalue 或 prvalue? cppreference 说,decltype(expression) 将声明:1. T&& if expression
我是一名优秀的程序员,十分优秀!