C++ 为什么我不';将const ptr分配给const reference时不会出现编译错误?

C++ 为什么我不';将const ptr分配给const reference时不会出现编译错误?,c++,C++,我在一个项目中工作,得到了一个我不理解的“奇怪行为”,它是关于传递const ptr来分配const ref(或const ptr作为const ref参数)编译,但为什么/如何编译?(我只是想理解) 我只是为了测试做了一个较小的示例代码。 如果有错误/误解,对不起,我不是以英语为母语的人 我用-Wextra-Wall编译 类虚拟 { 公众: 虚拟(const bool&run):_dummy_run(run){} void printRun() {std::cout 为什么它在将常量ptr传递

我在一个项目中工作,得到了一个我不理解的“奇怪行为”,它是关于传递const ptr来分配const ref(或const ptr作为const ref参数)编译,但为什么/如何编译?(我只是想理解) 我只是为了测试做了一个较小的示例代码。 如果有错误/误解,对不起,我不是以英语为母语的人

我用-Wextra-Wall编译

类虚拟
{
公众:
虚拟(const bool&run):_dummy_run(run){}
void printRun()
{std::cout
为什么它在将常量ptr传递给常量引用时成功编译

编辑:因为您的指针正在转换为临时
bool
,即
nullptr
的引用设置为临时
false
,否则设置为临时
true

为什么我有像“191”这样的印刷值


编辑:因此,当您打印时,此临时文件已超出范围,因此您的指针引用是未定义的行为。

这里发生了两件事。这两件事都是废话,都不是您的错

首先,当您获取一个
const bool*
并将其传递给一个获取
const bool&
的构造函数时,编译器知道您没有取消引用它,所以它会寻找一种方法来继续执行您的请求

它可以通过检查指针是否为
nullptr
(与
if(booleanptr)
一样),隐式地获得
bool
。然后,该临时
bool
用于初始化构造函数/函数参数中的引用,它可以这样做,因为它是
const
引用

这已经够糟糕的了

第二个问题是,您从该引用初始化了一个成员,但它会立即挂起,因为临时对象的生存期没有延长那么长。当构造函数调用结束时,它就会消失。这就是为什么打印输出很奇怪:您试图使用挂起的引用来做未定义的事情

(实际上,现在内存中的位模式可能不是实现识别为“真”或“假”的位模式;事实上,我打赌它在内部使用“0”和“1”,只输出布尔的int版本。但这是实现的选择,其他任何事情都可能发生。)

所有这些困惑来自两个方面:

  • 您的指针类型和引用类型(
    bool
    )恰好相同
  • C++有你看不到的愚蠢的透明转换

这可能与指向bool()的指针的隐式转换有关和临时变量。
const bool*
是否应该在不取消引用的情况下隐式转换为
const bool&
。我想真正发生的是指针被测试为空,然后结果被延长生命周期以初始化ref@LightnessRacesinOrbit非常正确-我错过了没有被尊重。编辑了答案。答案的第二部分仍然是错误的。一旦更正,它将只是我的一个简短版本;)