Ошибки, баги, вопросы - страница 1925

 

Нет сообщения об ошибке

struct A {
        int z;
};
void OnStart()
{
        int const b; //'b' - 'const' variable must be initialized
        A   const a; //нет сообщения об ошибке //по сути равнозначно записи: int const а.z; 
}
Должны присутствовать или явный конструктор или инициализирующая последовательность
 

Из-за конструктора. Так что все норм.

 
fxsaber:

Из-за конструктора. Так что все норм.

Из-за конструктора, который ничего не делает ?

struct A {
        A() {}
        int a;
}; 
void OnStart()
{
        const A a; //нормально
}

Если можно не инициализировать const int A::a то зачем тогда обязательно инициализировать const int b в предыдущем случае?

 
A100:

Из-за конструктора, который ничего не делает ?

Да, из-за пустого конструктора по-умолчанию.

Если можно не инициализировать const int A::a то зачем тогда обязательно инициализировать const int b в предыдущем случае?

Почему вместо Warning выдает Error? Ведь можно же так

void OnStart()
{
  int a;
  const int b = a;
}

ИМХО, должен быть Warning, когда const-переменная простого типа не инициализируется. И не должно быть Warning, когда значение OrderSend не проверяется. Но это, похоже, видение правильного разработчиками. Т.е. аргументация субъективна.

 
fxsaber:

Почему вместо Warning выдает Error? Ведь можно же так

Потому что использование неинициализированной константной переменной лишено смысла - поэтому и ошибка (она содержит случайное значение и это нельзя в дальнейшем изменить)

 
A100:

Потому что использование неинициализированной константной переменной лишено смысла - поэтому и ошибка (она содержит случайное значение и ее дальнейшее использование приведет к трудноуловимым ошибкам)

В цитате зачеркнул одно слово, но смысл не изменится, если в дальнейшем будут только read-only операции. Для non-const выдает Warning, для const - Error. Это просто одно из спорных решений разработчиков.

 
fxsaber:

, если в дальнейшем будут только read-only операции. 

Компилятор не знает (и не должен знать) какие будут в дальнейшем операции (иначе время компиляции будет часы а не минуты)
 
A100:
Компилятор не знает (и не должен знать) какие будут в дальнейшем операции (иначе время компиляции будет часы а не минуты)
void OnStart()
{
  int a; // variable 'a' not used
}
 
fxsaber:

Компилятор дошел до 1-ой строки - выдал предупреждение - потому что дальнейшие операции он не анализирует, а переменную <a> можно инициализировать позднее. А если

 const int a;

то выдал бы ошибку потому что ее нельзя инициализировать позднее (а дальнейшие операции компилятор не анализирует и не знает что она например в дальнейшем вообще не используется)

Все логично и не зависит от субъективных предпочтений

 
A100:

Компилятор дошел до 1-ой строки - выдал предупреждение - потому что дальнейшие операции он не анализирует, а переменную <a> можно инициализировать позднее. А если

то выдал бы ошибку потому что ее нельзя инициализировать позднее (а дальнейшие операции компилятор не анализирует и не знает что она например в дальнейшем вообще не используется)

Все логично и не зависит от субъективных предпочтений

Нелогично, почему нельзя использовать мусорную const-переменную.