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

Программа ниже компилируется (с помощью gcc), но должна ли она? Я бы подумал, что V1(1.0), созданная ниже, является константой, и поэтому для нее нельзя вызвать неконстантный метод.

class V{
  double v;
 public:
  V(double v1){ v = v1;}
  void clear(){ v = 0;}
};

int main(){
  V(1.0).clear();
}

Сравните это с функцией «void f(int &t){}», которую нельзя вызвать как «f(1)», потому что 1 — это константа, которая не может быть значением для неконстантной ссылки t.


person Ekalavya    schedule 24.04.2012    source источник
comment
временно != константа (как вы обнаружили)   -  person valdo    schedule 24.04.2012
comment
Что здесь должно быть постоянной структурой?   -  person leftaroundabout    schedule 24.04.2012
comment
Я не понимаю, как что-то может быть const. Ключевое слово не появляется нигде в вашем коде. Кроме того, синтаксис инициализации члена.   -  person chris    schedule 24.04.2012
comment
Вы также можете изучить ссылки на r-значения (С++ 11) для вашего предположения void f(int &t){}. Немного другая, но очень похожая концепция.   -  person chris    schedule 24.04.2012


Ответы (2)


V(1.0) вызывает конструктор, который инициализирует double v1 копированием. Итак, у вас есть временная копия литерала.

person juanchopanza    schedule 24.04.2012

Вы, кажется, путаете константы с r-значениями. f(1) было бы недопустимо, потому что 1 не является l-значением. V(1.0) не постоянная, а временная.

person Luchian Grigore    schedule 24.04.2012
comment
Я предполагал, что временные значения не должны отображаться как l-значения. - person Ekalavya; 24.04.2012