Баг компилятора: cannot convert from const pointer to nonconst pointer

 

Билд 1881.  Баг компилятора: путает константность указателя с константностью объекта, на который он ссылается.  Здесь переменная a - это не константа.

template<typename T>
void F(T&, const T)
{
}

void OnInit()
{
  const void *a, *b;
  F(a, b);  // 'a' - cannot convert from const pointer to nonconst pointer
}
 

Вот из той же серии.  Здесь аргумент b внутри функции является константным указателем, однако компилятор считает что константой является объект, на который он ссылается.  И выдаёт ошибку не в том месте.  Ошибка должна быть в строчке  b=NULL;

class A
{
 public:
  void f()  {  }
};

template<typename T>
 void Func(const T b)
 { 
   b=NULL;
   b.f();  // 'f' - call non-const method for constant object
 } 

void OnStart()
{
  A a;
  Func(&a);
};
 
Alexey Navoykov:

Билд 1881.  Баг компилятора: путает константность указателя с константностью объекта, на который он ссылается.  Здесь переменная a - это не константа.

https://stackoverflow.com/questions/1143262/what-is-the-difference-between-const-int-const-int-const-and-int-const

What is the difference between const int*, const int * const, and int const *?
What is the difference between const int*, const int * const, and int const *?
  • stackoverflow.com
I always mess up how to use , , and correctly. Is there a set of rules defining what you can and cannot do? I want to know all the do's and all don'ts in terms of assignments, passing to the functions, etc.
 
class A
{
 public:
  void f()  {  }
};

template<typename T>
 void Func( T* const b )
 { 
   b=NULL; // 'b' - constant cannot be modified
   b.f();
 } 

void OnStart()
{
  A a;
  Func(&a);
};
 

Подобная ошибка при компиляции

class A {};
template<typename T> void g1( T const ) {} //(1)
template<typename T> void g2( T       ) {} //(2)
void OnStart()
{
        A a;
        g1( &a ); //Error: 'g' - cannot to apply function template
        g2( &a ); //нормально
};
А какая принципиальная разница между g1 и g2?
 
A100:

Подобная ошибка при компиляции

А какая принципиальная разница между g1 и g2?

const T и T const - принципиальная разница.

class A {};
template<typename T> void g1( T* const ) {}
template<typename T> void g2( T*       ) {}
 

насколько я помню в mql есть нюансы с константностью. могу ошибаться.

в с++ const T* === T const *

в mql const T* === T const * const

этот вопрос как-то всплывал где-то на форуме с ответом от разрабов

но судя по примерам дальше, есть еще нюансы в выведении типов в шаблонах

 
A100:
А какая принципиальная разница между g1 и g2?

никакой. бредовая ошибка

 
fxsaber:

const T и T const - принципиальная разница.

А где Вы в моем примере увидели const T ??? Придумывать не нужно
 
A100:
А где Вы в моем примере увидели const T ??? Придумывать не нужно

Для чего нужно было писать const после T, а не до? Напишите ДО и будет пахать.

А если хотите после, тогда это имеет прямое отношение к указателю и, соответственно, ставьте звездочку после T.

 
fxsaber:

Для чего нужно было писать const после T, а не до? Напишите ДО и будет пахать.

А если хотите после, тогда это имеет прямое отношение к указателю и, соответственно, ставьте звездочку после T.

Обсуждается конкретный код... конкретная ошибка, а не методы её обхода - я их и без Вас знаю и не один