相关疑难解决方法(0)

什么是右值,左值,x值,glvalues和prvalues?

在C++ 03中,表达式是rvaluelvalue.

在C++ 11中,表达式可以是:

  1. 右值
  2. 左值
  3. x值
  4. glvalue
  5. prvalue

两类已成为五大类.

  • 这些新的表达类别是什么?
  • 这些新类别如何与现有的左值和左值类别相关联?
  • C++ 0x中的右值和左值类别是否与它们在C++ 03中的相同?
  • 为什么需要这些新类别?是WG21神只是想迷惑我们凡人?

c++ expression c++-faq c++11

1291
推荐指数
13
解决办法
17万
查看次数

C++标准究竟在哪里说取消引用未初始化的指针是未定义的行为?

到目前为止,我无法找到如何推断以下内容:

int* ptr;
*ptr = 0;
Run Code Online (Sandbox Code Playgroud)

是未定义的行为.

首先,有5.3.1/1表示这*意味着转换T*为的间接T.但这对UB没有任何说明.

然后经常引用3.7.3.2/4说在非空指针上使用解除分配函数会使指针无效,之后无效指针的使用是UB.但是在上面的代码中没有关于释放的内容.

如何在上面的代码中推导出UB?

c++ standards undefined-behavior language-lawyer

11
推荐指数
5
解决办法
3494
查看次数

为什么绑定到三元组的const引用会复制?

我很困惑这个:

#include <iostream>
struct X {};
void f( const X &x ) { std::cerr << &x << "\n"; }

static X x;
int main()
{
  f( x ); // Off stack address
  f( false ? X() : x ); // Different address on stack.
}
Run Code Online (Sandbox Code Playgroud)

为什么f的第二次调用会产生临时副本?

编辑:这个问题不是关于类型X,而是复制的事实.我从接受的答案中忽略了值类别的过剩,并且期望f的参数直接绑定在x或X()上,就像将其重新表述为if语句一样.

c++

11
推荐指数
1
解决办法
590
查看次数

什么标准条款要求这个左值到右值的转换?

鉴于:

int main() {
   int x = 0;
   int y = x; // <---
}
Run Code Online (Sandbox Code Playgroud)

可能有人请告诉我的标准(2003年首选)的这条强制要求表达的转换x,从左值右值在对象的初始化y

(或者,如果我错了,并且没有发生这样的转换,那么我也想学习它!)

c++ language-lawyer

8
推荐指数
2
解决办法
602
查看次数

为什么在这里创建临时对象?

class X{
public:
    X(){}
};

class Y{
public:
    Y(X x) { std::cout << "Temporary created!"; }
};

int main(){
    X x;
    const Y& y = x;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么Y在这里创建临时对象(类型为 )?我理解在这种情况下临时对象的必要性,但我不明白标准对此有何说明。如果我们看一下标准,如果我没有记错的话,唯一适合我们这里情况的情况就是绑定对纯右值的引用。x那么, in 中的子表达式是否const Y& y = x被转换为纯右值,或者这里发生了什么其他事情?

我还查看了lvalue -> rvalue conversion,但整个事情似乎解释不清。它没有说明发生这种类型转换的场景。据我所知,这种转变发生的次数比我想象的要多。例如,如果我们看一下cpp.reference 上的隐式转换,几乎每个部分都以“XXX 类型的纯右值可以转换为 YYY...”开头,这表明我们在隐式转换中大多数时候使用左值->右值转换作为某种基本转换。密切相关的是,我也研究了这个主题,这可能是对整个情况的一个很好的看法,但也可能相当过时。

基本上,我有两个问题。标题中的第一个和(可能不相关)第二个:左值 -> 右值转换何时实际发生?

编辑:关于我的第一个问题(来自标题),我已经发展了一种我认为与草案相符的理论。基本上,表达式x被转换为类型的纯右值const Y,但不创建任何对象。之后,我们绑定了纯右值,这会导致临时物化将纯右值转换为 xvalue。只有这样我们才能绑定const对该临时对象的引用。我离真相有多远?

c++ language-lawyer implicit-conversion

5
推荐指数
1
解决办法
609
查看次数