错误、漏洞、问题 - 页 1730

 
Ilyas:
这就对了,在这里打字,T = A *

然后这里出现了一个编译错误

template<typename T>
void f1( const T  const & a[] ) {} //error: 'const' - unexpected token
class A {};
void f2( const A* const & a[] ) {}
class B {
        void g1() const { f1( a ); }
        void g2() const { f2( a ); }
        A *a[];
};
 
Sergei Vladimirov:
正是如此。我读了所有这些说法,仍然不明白问题出在哪里。你打算把这些文件存储在软盘上吗?


当你保存一个100K的文件而不是50K的文件时,是否会磨损你的磁盘?(你不觉得这很有趣吗?)

因为一个版权字符(原则上是国际性的,在所有的编码中都有,尽管它的代码大于127),文件大小 就毫无意义地增加了一倍,这正常吗?这不是很聪明吗?为什么在没有任何需要的情况下将文件膨胀2倍?

问题不仅在于尺寸,还在于上下文搜索。只要文件是ASCII格式,你可以使用许多第三方程序,包括文件管理器,使用上下文字符串搜索文件。我几乎每天都在使用这个。原生的MQ编辑器在这方面和其他许多明显的编码问题一样,都是零。一旦我们有了unicode,上下文搜索就有两个问题:不是所有的程序都能或都想这样做,而对于那些能做的程序,我们会得到第2点--缓慢。

当然,有些人认为除了硬盘之外,买一台更快的电脑比思考或至少从其他产品中了解软件应该如何方便和高效更容易。

 
A100:

然后这里出现了一个编译错误

在C++中也存在着类型的模糊性:Const T const

但有一条出路--将建筑向右移动

template<typename T>
void f1(  T         const & a[] ) {} //error: 'const' - unexpected token
class A {};
void f2(  A const * const & a[] ) {} //нормально
class B {
        void g1() const { f1( a ); } //error: 'f1' - cannot to apply function template
        void g2() const { f2( a ); } //нормально
        A *a[];
};
C++的编译没有错误(考虑到语法上的不同)。
 
A100:

在C++中,也存在着类型的模糊性: const T const

但有一条出路--将建筑向右移动

C++的编译没有错误(考虑到语法上的不同)。

但从逻辑上讲,当 "const A "和 "A const "是同一意思时,就很奇怪了。

也许"Aconst*"是一个指向非const对象 的常数指针。

情况似乎是这样的。因为这样的结构存在。

class A {};
void f( const A const * const & a[] ) {}

你不能改变指针,你不能通过引用来改变,你不能改变对象。

从获得快速代码的角度来看,这样的结构能否给编译器一个适当的提示?

 
Stanislav Korotky:

一个版权字符(原则上是国际性的,在所有编码中都有,尽管它的代码大于127)导致文件大小增加两倍,这是否正常...

是的,就所有的意图和目的而言,我不认为在火柴上节约有什么意义。
 
有趣的是,在这个结构中
class A {};
void f( const A const * & a[] ) {}

你不能改变元素,但你可以改变数组的大小

有趣的是,事实证明,方法可以是这样的

class A {};
class B
{
  const A const * Method( const A const * const & a[] ) const
  {
    return(a[0]);
  }
};
 
fxsaber:

有可能"Aconst*"是一个常数指针,而不是一个常数对象 的指针。

如果不是一个模式,那么 "A const *"等于 "Const A *",如果是一个模式,按这种情况(在C++中),就等于
 
A100:
如果不是一个模式,那么 "A const *"等于 "Const A *",如果是一个模式,那么根据情况
所以不应该有任何等同性。然而,MQL认为它是等同的
class A
{
public:
  int i;
};

void f( A const * & a[] )
{
  a[0].i = 1; // 'i' - constant cannot be modified
}
在我看来,这里有一个错误。因为传递的是一个常量指针数组(const *),而不是一个指向常量对象 的指针数组(const A)
 
A100:
具体来说是这样的--在未来修复https://www.mql5.com/ru/forum/1111/page1749#comment_2892563
那么,在你的声明中就不应该有任何等同的内容
A100:
如果不是一个模式,那么 "A const *"等于"Const A *",如果是一个模式--按这种情况(在C++中),则
 
fxsaber:
有趣的是,在这样的设计中...
class A {};
void f( const A const * & a[] ) {}

元素不能被改变,但数组的大小可以被改变。

真的吗?这真让人扫兴,不应该是这样的。