【发布时间】:2021-03-07 14:02:55
【问题描述】:
我正在完成 C++ Primer 中的练习,并找到了练习 2.32 的在线解决方案。
我了解到以下代码是非法的,因为初始化不能从 int 转换为 int*:
int null = 0, *p = null;
但是,我没有想到的两个解决方案是:
const int null3 = 0, *p3 = null3;
constexpr int null4 = 0, *p4 = null4;
为什么在编译过程中允许这些没有错误?我仍然期望 p3 和 p4 的初始化需要 & 来表示地址(&null3,&null4)。
这是我记事本文件中的代码:
#include <iostream>
int main()
{
// int null = 0, *p = null; // it is not legal; depending on intent there are two ways to fix (that I can think off atm)
{
int null = 0, *p = &null; // if the goal is to point to 'null'
}
{
int null2 = 0, *p2 = 0; // if the goal is to create a nullptr
}
{
const int null3 = 0, *p3 = null3; // if the goal is to create a nullptr
}
{
constexpr int null4 = 0, *p4 = null4; // if the goal is to create a nullptr
}
return 0;
}
当我通过 Microsoft Visual Studio CMDPrompt 运行时,它允许我“cl "Exercise 2.32.cpp"' 没有错误。
【问题讨论】:
-
const int null3 = 0, *p3 = null3;这仍然给出错误你确定它正在编译吗? -
没有错误?我没有找到接受它的编译器:godbolt.org/z/aK1Gvz。你用的是哪个编译器?
-
@D'Kayd:那不应该编译。
-
绝对是@Bathsheba
标签: c++ pointers initialization constants constexpr