오류, 버그, 질문 - 페이지 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 :
정확히. 이 모든 주장을 읽었지만 문제가 어디에 있는지 파악할 수 없습니다. 이 파일을 플로피 디스크에 저장하시겠습니까?


50킬로바이트가 아닌 100킬로바이트 파일을 저장하면 디스크가 마모됩니까? 자체가 웃기지 않습니까? )

그리고 하나의 저작권 기호(코드가 127보다 크다는 사실에도 불구하고 원칙적으로 국제적이고 모든 인코딩에 존재함) 때문에 파일 크기 가 아무 의미 없이 두 배로 늘어나는 것이 정상입니까? 똑똑하죠? 파일을 불필요하게 2배 팽창시키는 이유는 무엇입니까?

문제는 크기뿐만 아니라 문맥 검색에도 있습니다. 파일이 ASCII 형식이면 파일 관리자를 비롯한 많은 타사 프로그램이 컨텍스트 문자열로 파일을 검색할 수 있습니다. 나는 이것을 거의 매일 사용합니다. 이와 관련하여 기본 MQ 편집기는 다른 많은 명백한 코딩 문제에서와 마찬가지로 0입니다. 유니코드를 얻자마자 컨텍스트 검색에 2가지 문제가 발생합니다. 먼저 인코딩을 "이해"한 다음 단일 형식으로 정규화(예: 모든 ASCII를 즉시 유니코드로 인코딩)한 다음 "검색"해야 합니다. 모든 프로그램이 이를 수행할 수 있거나 원하는 것은 아니지만 그것은 할 수 있습니다, 우리는 포인트 2 - 브레이크를 얻습니다.

물론 어떤 사람들에게는 나사 외에 새 컴퓨터를 사는 것이 편리하고 효과적인 소프트웨어가 무엇인지 생각하거나 적어도 다른 제품의 예에서 배우는 것보다 쉽습니다.

 
A100 :

다음은 컴파일 오류입니다.

C++에서도 모호성을 입력하십시오. const T const

그러나 탈출구가 있습니다 - 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

그러나 탈출구가 있습니다 - const를 오른쪽으로 재배열하십시오

C++는 오류 없이 컴파일됩니다(구문 차이 고려).

그러나 논리적으로 "const A"와 "A const"가 같은 것을 의미할 때 이상하게 나타납니다.

" A const * "가 const 객체 가 아닌 const 포인터일 가능성이 있습니다.

그것은 처럼 보인다. 왜냐하면 그런 구조가 존재한다

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

포인터를 변경할 수 없으며 참조로 변경할 수 없으며 개체를 변경할 수 없습니다.

빠른 코드를 얻는 관점에서 이러한 구성은 컴파일러에 필요한 힌트를 줄 수 있습니까?

 
Stanislav Korotky :

그리고 하나의 저작권 기호(코드가 127보다 크다는 사실에도 불구하고 원칙적으로 국제적이고 모든 인코딩에 있음)로 인해 파일 크기가 2배 증가하는 것이 정상입니다...

네. 내 인생에서 나는 경기에서 이 경제의 의미가 없다고 생각합니다.
 
흥미롭게도 그러한 디자인에서
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 :

" A const * "가 const 객체 가 아닌 const 포인터일 가능성이 있습니다.

템플릿이 아닌 경우 "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) 이 아니라 const 포인터 배열(const *)이 전달됩니다.
 
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[] ) {}

요소는 변경할 수 없지만 배열의 크기는 변경할 수 있습니다.

진지하게? 젠장, 그렇게 되어서는 안 됩니다.