C++ 为什么我不';将const ptr分配给const reference时不会出现编译错误?
我在一个项目中工作,得到了一个我不理解的“奇怪行为”,它是关于传递const ptr来分配const ref(或const ptr作为const ref参数)编译,但为什么/如何编译?(我只是想理解) 我只是为了测试做了一个较小的示例代码。 如果有错误/误解,对不起,我不是以英语为母语的人 我用-Wextra-Wall编译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 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非常正确-我错过了没有被尊重。编辑了答案。答案的第二部分仍然是错误的。一旦更正,它将只是我的一个简短版本;)