错误、漏洞、问题 - 页 2356

 
A100:

在C++中:A::f()

这个代码说的是什么?

((A*)&b).f();
 
fxsaber:

这个代码说的是什么?

这也是一样的。

 
Ilya Malev:

同样的事情。

作为MQL(假设它被转换为C++形式)。但 可以自己检查一下
 
A100:
这和MQL(假设它被转换为C++形式)。但 可以自己检查一下

已检查。


 
Ilya Malev:

已检查。

我认为你检查的东西是错误的。

B*b1=a;

在MQL中,这样的条目意味着将一个对象a-复制到一个由指针b1定位的对象。 当然,一般来说,它不应该被编译。

为了不混淆对象和指针,你最好对指针使用p前缀

 
Ilya Malev:

已检查。

请不要把这种错误的行为记录在册。

这里有两个问题(?)。

  1. B *b1=a - 一个显式错误,编译器认为这个结构是对复制操作符A::A(const A &)的调用。

  2. 在第一种情况下,优化器检测到A::A(const A &)是空的,没有成员--没有通过 "指针 "访问(事实上,没有调用复制操作符的代码,一切都被剪掉了)。
    虚拟的B::f()没有被重载,所以它不是一个虚拟的调用,而是一个简单的调用,B::f()中没有成员寻址,所以通过 "指针 "访问也被删除了

    在第二种情况下,A::f()是一个尝试性的虚拟调用,有 "指针 "访问,但没有a1对象,因为一个空的复制构造函数A::A(const A &)也被调用,用于A *a1=b。
 
Ilyas:

请不要在这种错误的行为上投资。

这里有两个问题(?)。

我希望你们能解决这个错误的行为?(犯编译错误)因为有可能意外地犯这样的错误,而编译器没有任何反应。

 
Alexey Navoykov:

我希望你们能解决这个错误的行为?因为有可能不小心犯这样的错误,而编译器却没有任何反应。

是的,我们将修复它。

优先级被设置得很低,因为只有空的类才能得到工作代码

 
Ilyas:

请不要在这种错误的行为上投资。

这里有两个问题(?)。

  1. B *b1=a - 一个明显的错误,编译器认为这个结构是对复制操作符A::A(const A &)的调用。

  2. 在第一种情况下,优化器已经确定A::A(const A &)是空的,没有成员--没有通过 "指针 "访问(事实上,没有调用复制操作符的代码,一切都被删掉了)。
    虚拟的B::f()没有被重载,所以它不是一个虚拟的调用,而是一个简单的调用,B::f()中没有成员寻址,所以通过 "指针 "访问也被删除了

    在第二种情况下,A::f()是一个尝试性的虚拟调用,有 "指针 "访问,但没有a1对象,因为一个空的复制构造函数A::A(const A &)也被调用,用于A *a1=b。

谢谢你的详细回答,然而,我对这个逻辑有点迷惑。

1) 为什么编译器将构造B* b1=a视为调用复制运算符A::A(const A&),(而不是调用B::B(const A&),因为它是运算符=左边的类B)?

2)为什么编译器没有产生 "缺少复制构造函数 "的警告?

3)为什么对不存在的对象允许 "简单 "的方法调用(而试图直接调用B::f()会出现 "不是静态方法 调用 "的编译错误)?

4)为什么编译器允许一个 "简单的 "虚拟方法调用?在我看来,虚拟性不应该取决于对象中数据的存在与否

 
Ilya Malev:

1)为什么编译器将B* b1=a看作是对复制运算符A::A(const A&)的调用,(而不是调用B::B(const A&),因为它是运算符=左边的B类)。

这是MQL的另一个错误,编译器允许这样的事情:B b = a; 这违反了封装原则。 在C++中,这样的事情不能自然编译,需要明确的转换。 而在旧的MQL构建中,这样的事情也不能做。