相关疑难解决方法(0)

将const int和vs int分配给const int&

我试图理解C++中的常量引用,我偶然发现了这个问题:

当我将double赋值给const int&然后更改引用double的值时,my int引用的值保持不变.

    double i = 10;
    const int &ref = i;    
    i = 20;

    cout << "i: " << i << endl;      // i = 20
    cout << "&ref: " << ref << endl; // ref = 10
Run Code Online (Sandbox Code Playgroud)

而在分配int时,值会发生变化.

    int i = 10;
    const int &ref = i;    
    i = 20;

    cout << "i: " << i << endl;      // i = 20
    cout << "&ref: " << ref << endl; // ref = 20
Run Code Online (Sandbox Code Playgroud)

这种行为的原因是什么?我的猜测是,当分配double时,隐式转换为int会创建一个新对象,然后分配它的引用,但是我无法在任何地方找到它.

c++ int const

8
推荐指数
1
解决办法
1137
查看次数

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

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++ const 引用允许从表达式进行更改吗?

在《C++ Primer 5th Edition》中有关 const 引用的部分中,有一个小示例块:

int i = 42;
const int &r1 = i; // we can bind a const int& to a plain int object
const int &r2 = 42; // ok: r1 is a reference to const
const int &r3 = r1 * 2; // ok: r3 is a reference to const
int &r4 = r * 2; // error: r4 is a plain, non const reference
Run Code Online (Sandbox Code Playgroud)

在第四行,我只是好奇常量引用的常量引用如何能够成功地将值乘以 2。当 r1 引用 i 时,不会发生转换,使所有内容都成为常量吗?或者第 4 行中的表达式对于 r3 来说是独立的吗?

c++

3
推荐指数
1
解决办法
406
查看次数

标签 统计

c++ ×3

const ×1

implicit-conversion ×1

int ×1

language-lawyer ×1