Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么没有从指针到引用的隐式转换?_C++_C++03 - Fatal编程技术网

C++ 为什么没有从指针到引用的隐式转换?

C++ 为什么没有从指针到引用的隐式转换?,c++,c++03,C++,C++03,为什么??我知道错误的原因,也知道如何修复它,我很好奇为什么编译器不能隐式地执行转换,而我的意图是让指针和引用引用指向同一个内存位置,这对我来说似乎微不足道。是否有我遗漏的任何角落案例?C++有一段很长的错误历史,源于隐式转换。看一看斯蒂芬·德赫斯特的书《C++Gotchas》;最长的一章是关于转换的。这个主题实际上充满了陷阱,我们应该高兴的是,上面的内容必须明确地打印出来。话虽如此 有没有我丢失的角落里的箱子 考虑如下所示的重载集: ./example.cpp: In function 'in

为什么??我知道错误的原因,也知道如何修复它,我很好奇为什么编译器不能隐式地执行转换,而我的意图是让指针和引用引用指向同一个内存位置,这对我来说似乎微不足道。是否有我遗漏的任何角落案例?

C++有一段很长的错误历史,源于隐式转换。看一看斯蒂芬·德赫斯特的书《C++Gotchas》;最长的一章是关于转换的。这个主题实际上充满了陷阱,我们应该高兴的是,上面的内容必须明确地打印出来。话虽如此

有没有我丢失的角落里的箱子

考虑如下所示的重载集:

./example.cpp: In function 'int main()':

./example.cpp:7:11: error: invalid conversion from 'int*' to 'int' [-fpermissive]

    7 |  int& z = y;

      |           ^

      |           |

      |           int*

./example.cpp:7:11: error: cannot bind rvalue '(int)y' to 'int&'
以及指针隐式转换为引用的图像。下面的电话

void f(void *n);
void f(int& n);
将是模棱两可的,因为这两种转换将被视为同等适合。这是不必要的混淆

另一个例子是对指针的引用。不一定是你经常做的事情,但这是有效的:

int n = 42;

f(&n);
使用指向引用转换的隐式指针,上述内容将编译为

int n = 42;
int* ptr = &n;

int*& refToPtr = ptr;

同样,尽管您的意思不同,但再次强调,在这里不太宽容是防止此类错误的一件好事。

C++有一段很长的由隐式转换引起的错误历史。看一看斯蒂芬·德赫斯特的书《C++Gotchas》;最长的一章是关于转换的。这个主题实际上充满了陷阱,我们应该高兴的是,上面的内容必须明确地打印出来。话虽如此

有没有我丢失的角落里的箱子

考虑如下所示的重载集:

./example.cpp: In function 'int main()':

./example.cpp:7:11: error: invalid conversion from 'int*' to 'int' [-fpermissive]

    7 |  int& z = y;

      |           ^

      |           |

      |           int*

./example.cpp:7:11: error: cannot bind rvalue '(int)y' to 'int&'
以及指针隐式转换为引用的图像。下面的电话

void f(void *n);
void f(int& n);
将是模棱两可的,因为这两种转换将被视为同等适合。这是不必要的混淆

另一个例子是对指针的引用。不一定是你经常做的事情,但这是有效的:

int n = 42;

f(&n);
使用指向引用转换的隐式指针,上述内容将编译为

int n = 42;
int* ptr = &n;

int*& refToPtr = ptr;

也,即使你的意思不同,但在这里,不那么宽容,这是防止错误的好方法。

< P>你应该把C++引用当作一个别名而不是指针。这与看起来更像指针的Java引用不同。那么编译器的消息就非常清楚了:带别名的对象应该是int,而您尝试引用int*


<>参考文献信息:

你应该把C++引用当作一个别名而不是指针。这与看起来更像指针的Java引用不同。那么编译器的消息就非常清楚了:带别名的对象应该是int,而您尝试引用int*


有关引用的详细信息:

指针可以为空,引用不能为空

注意:你不能这么做

int& refToPtr = &n;

<>如果C++允许隐式转换引用指针,它意味着它将隐含地指向一个指针,它可以是ub.< /p> 指针可以是null,引用不能。 注意:你不能这么做

int& refToPtr = &n;

<>如果C++允许隐式转换引用指针,它意味着它将隐含地指向一个指针,它可以是ub.< /p>你必须<代码> int和z=*y;代码>或
int*&z=y如果你想引用指针本身。是的,我知道。我很好奇为什么编译器不能自己推断它。因为它不是标准的。C++是与C兼容的,它具有严格的指针操作。区分指针和指针所指向的值是至关重要的,因此,如果编译器对程序员隐藏这些值,将导致许多低级错误。高级语言可以做你所说的事情,因为它们不是设计为指针操作繁重的。你有它的倒退。需要对标准中的功能进行调整才能插入,而不是相反。默认情况下排除所有内容。您必须
int&z=*y
int*&z=y如果你想引用指针本身。是的,我知道。我很好奇为什么编译器不能自己推断它。因为它不是标准的。C++是与C兼容的,它具有严格的指针操作。区分指针和指针所指向的值是至关重要的,因此,如果编译器对程序员隐藏这些值,将导致许多低级错误。高级语言可以做你所说的事情,因为它们不是设计为指针操作繁重的。你有它的倒退。需要对标准中的功能进行调整才能插入,而不是相反。默认情况下,所有内容都被排除在外。我可以看到这里的问题,但我也可以感觉到它们可能会在以后被发现。在第一种情况下,可以使用多重继承(一个示例)构造一个类似的函数,编译器会给出一个不明确的调用错误。在第二种情况下,将
m
保留为
int*&
,像今天这样编译是一种可行的方法,因为它不会涉及其他解释所需的隐式转换。当您将歧义与多重继承场景进行比较时,我认为没有更多这样的案例是一件好事。我可以看到这里的问题,但我也可以感觉到它们可能会在以后被发现。在第一种情况下,可以使用多重继承(一个示例)构造一个类似的函数,编译器会给出一个不明确的调用错误。在第二种情况下,将
m
保留为
int*&
,像今天这样编译是一种可行的方法,因为它不会涉及其他解释所需的隐式转换。当您将这种模糊性与多重继承场景进行比较时,我认为没有更多这样的情况是一件好事。