小编Jam*_*oon的帖子

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

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
查看次数

C程序错误打印

#include <stdio.h>
int main() {
  int x[] = {2, 3, 1, 5, 6, 9};
  int j, i, s;
  for (i=0; i<6; i++){
    if (x[i] % 2 == 1){
      break;
    }
  }

  printf("%d", i);
  for (j=5; j>1; j--){
    x[j+1] = x[j];
  }
  printf("%d", i);

  return 0;
} 
Run Code Online (Sandbox Code Playgroud)

首先printf打印1,而另一个printf打印9.i你可以看到我在此期间没有改变.为什么打印9?

c

4
推荐指数
1
解决办法
75
查看次数

`static const int a = std::random_device{}();` 中的 `a` 是泛左值核心常量表达式吗?

Cppreferencea声明中定义的表达式

\n

static const int a = std::random_device{}();

\n

是左值常量表达式。这意味着它也必须是一个核心常量表达式,也就是说,除其他条件外,它的求值不得涉及对未按此处constexpr所述声明的函数(或构造函数)的任何调用(第三点)。看看std::random_device 构造函数,我没有看到任何构造函数。constexpr

\n

我查看了有关此问题的草案,没有看到任何明确提及构造函数的内容,但我想说这里暗示了这一点:

\n
\n

\xe2\x80\x94 调用非 constexpr 函数;

\n
\n

我在这里错过了什么吗?另一方面,为什么它不是纯右值常量表达式?

\n

c++ language-lawyer constant-expression c++20

2
推荐指数
1
解决办法
163
查看次数

程序崩溃 - 分段错误

我的守则

int i,v,o,p,j;
v=0;
o=0;
char x[12]={'#','v','v','o','#','o','v','#','v','o','o','#'};
void vukovi (char a[])
{
    for (i=0;i<12;i++){
        if (x[i]=='#'){
            for (j=i+1;x[j]!='#';j++){
                if (x[j]=='v'){
                    v=v+1;
                }
                if (x[j]=='o')
                    o=o+1;
            }

            if (v>=o){
                for (j=i+1;x[j]!='#';j++){
                    if (x[j]=='o'){
                        x[j]='.';
                    }
                }
            }

        }
        v=0;
        o=0;
    }

for (i=0;i<12;i++){
    printf("%c",x[i]);
    }
}
vukovi(x);
return 0;}
Run Code Online (Sandbox Code Playgroud)

有时它打印得很好.
有时错误

.exe停止工作

我不知道为什么.
程序的想法是:两个地方之间的任何#地方都是v> o,o必须被替换为.
Like我说当它打印时,它打印得很好.
否则错误.救命 ?
(我遗漏了包含和主要功能).

c segmentation-fault

-1
推荐指数
1
解决办法
80
查看次数