2016-11-27 91 views
1

这是代码:指针引用为const空值

const int x = 0; 
const int& r = x; 

const int* p1 = x; // Works (p1 = 0) 
const int* p2 = r; // error C2440: 'initializing': cannot convert from 'const int' to 'const int *' 

为什么P1设置为X的值,但不是P2?

难道是因为p2不能仅仅通过查看r来保证x是const?
或者是否还有其他引起此错误的引用的其他细节?

+1

'cosnt int * p1 = x;'不应该编译。你正在使用哪种编译器? – Rakete1111

+0

您对'p1'的第一次尝试也不合法。你的指针初始化都是错误的。 –

+0

VS 2015与/ W4,/ sdl和/ WX开启。如果x不是const,那么它不编译,但是用const编译。 – lousybyte

回答

3

第三行应该引发错误。它不在VS2015中,因为如果编译器或标准中存在错误,取决于应用了哪种标准。其他编译器确实发出关于这一行的错误消息。

C++ 11之前,计算结果为0的任意整数常量表达式被视为空指针恒定,所以,第一行是相当于const int* p1 = NULL;,它不会使P1点为x

由于C++ 14不再是这种情况。粗略地说,只有文字零和nullptr是有效的空指针常量。

在这两者之间,也就是说,在C++ 11中,标准实际上允许常量表达式的值为零,以被视为空指针常量。这被认为是标准中的缺陷。它在C++ 14中得到了修复。一些编译器(gcc,clang)选择立即修复缺陷并在C++ 11模式下报告错误。 VS2015没有。

第四行从来没有在任何版本的C++中有效,因为r的类型是引用,而不是整数。

+0

我还没有找到任何在互联网上的这个错误的参考。你碰巧知道它是否有一个公开的问题,或者来自MS的任何官方信息(可能“不会修复”)? –

+3

C++ 11指出:“空指针常量是一个整型常量表达式(5.19)的整数类型的值,其值为 零或std :: nullptr_t类型的值。”显然它被认为是标准中的一个缺陷,并已在14中进行了更改。相关答案:http://stackoverflow.com/a/40787595/2456565 – krzaq

+0

@krzaq好抓 –

-1

指针代表的的地址的值,所以要初始化的指针,你应该使用“地址的”运算符:&

const int *p1 = &x; 
const int *p2 = &r; 

你可以设置一个指针0(其不是PC上的有效地址),因为这与将其设置为NULL相同。

+0

我知道,我故意将指针地址设置为null。这仅仅是为了学术目的。 – lousybyte

+0

*“您可以将指针设置为0(这不是PC上的有效地址),因为这与将其设置为”NULL“相同*”C++没有“NULL”,实际上,它的使用是令人沮丧的。该标准明确指出,可以使用文字'0'来初始化任何指针,使其成为实现定义的空指针值。而且,C++ 11(only)允许任何'constexpr'评估为'0'。 – StoryTeller

+0

*“您可以将指针设置为0(这不是PC上的有效地址),因为这与将其设置为NULL相同。”*不是他在代码中执行的方式,不是。 –