我们可以在 C++ 中用一个限定为常量且值为 0 的变量来初始化一个指针吗?
Can we initialize a pointer with a variable qualified as constant and having value 0 in C++?
根据C++ Primer这本书,我们可以将一个限定为const且值为0的变量赋值给一个指针。这是书中的相关行。
It is okay to assign the literal 0 or a const whose value is known to be 0 at compile time:
然后提供以下代码片段。
int ival;
int zero = 0;
const int c_ival = 0;
int *pi = ival; // error
pi = zero; // error
pi = c_ival // ok: c_ival is a const with compile-time value of 0
但是,当我运行类似的代码时,会抛出一个错误。
int main()
{
const int c_ival = 0;
int *pi = c_ival;
}
error: invalid conversion from 'int' to 'int*' [-fpermissive]
我做错了什么?
c_ival
是 int
类型。 pi
是 int*
类型。您不能将 int
隐式转换为 int*
因此您必须使用类型转换:
int *pi = (int*) c_ival; // C-style cast
// --or--
int *pi = reinterpret_cast<int*>(c_ival); // C++ style cast
这两种方法都有效,但都非常恶心。只需将 nullptr
分配给不指向任何东西并远离零的指针。
根据您的 C++ Primer 版本(以及它所针对的间接标准修订版),这可能只是信息过时的情况。
你看,C++03 和 C++11 之间的定义发生了变化。以前是这样写的:
[conv.ptr]
1 A null pointer constant is an integral constant expression (5.19)
rvalue of integer type that evaluates to zero.
但是一个突出的缺陷报告(CWG 903)被追溯应用到 C++11 并将措辞更改为
[conv.ptr]
1 A null pointer constant is an integer literal (5.13.2 [lex.icon])
with value zero or a prvalue of type std::nullptr_t.
因此,由于 C++11 c_ival
不再符合条件。它不是 文字 0,尽管它仍然是一个值为 0 的常量表达式。
Can we initialize a pointer with a variable qualified as constant and having value 0 in C++?
我们曾经。自 C++11 以来,我们不再可以了。
What am I doing wrong?
您正在阅读这本书的旧版本。
根据C++ Primer这本书,我们可以将一个限定为const且值为0的变量赋值给一个指针。这是书中的相关行。
It is okay to assign the literal 0 or a const whose value is known to be 0 at compile time:
然后提供以下代码片段。
int ival;
int zero = 0;
const int c_ival = 0;
int *pi = ival; // error
pi = zero; // error
pi = c_ival // ok: c_ival is a const with compile-time value of 0
但是,当我运行类似的代码时,会抛出一个错误。
int main()
{
const int c_ival = 0;
int *pi = c_ival;
}
error: invalid conversion from 'int' to 'int*' [-fpermissive]
我做错了什么?
c_ival
是 int
类型。 pi
是 int*
类型。您不能将 int
隐式转换为 int*
因此您必须使用类型转换:
int *pi = (int*) c_ival; // C-style cast
// --or--
int *pi = reinterpret_cast<int*>(c_ival); // C++ style cast
这两种方法都有效,但都非常恶心。只需将 nullptr
分配给不指向任何东西并远离零的指针。
根据您的 C++ Primer 版本(以及它所针对的间接标准修订版),这可能只是信息过时的情况。
你看,C++03 和 C++11 之间的定义发生了变化。以前是这样写的:
[conv.ptr]
1 A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to zero.
但是一个突出的缺陷报告(CWG 903)被追溯应用到 C++11 并将措辞更改为
[conv.ptr]
1 A null pointer constant is an integer literal (5.13.2 [lex.icon]) with value zero or a prvalue of type std::nullptr_t.
因此,由于 C++11 c_ival
不再符合条件。它不是 文字 0,尽管它仍然是一个值为 0 的常量表达式。
Can we initialize a pointer with a variable qualified as constant and having value 0 in C++?
我们曾经。自 C++11 以来,我们不再可以了。
What am I doing wrong?
您正在阅读这本书的旧版本。