теряет ли объект свою константность при неявном преобразовании? - PullRequest
4 голосов
/ 30 октября 2011

Я провел небольшой эксперимент, и я не понимаю вывод!

class C {
public:
  operator int() const { std::cout << "I'm const" << std::endl;}
  operator int(){ std::cout << "I'm not const" << std::endl;}
};

void f(int){};

int main()
{
  f(C());
}

Почему этот вывод "i'm not const"? Разве первое приведение объекта C, являющегося значением и, следовательно, константой, не должно быть приоритетным?

Спасибо! :)

Изменить: Если это может сделать вопрос более точным:

В связи:

void g(C const &){ std::cout << "I take a const" << std::endl; };
void g(C &){ std::cout << "I take a non const" << std::endl; };

g (C ()) выводит "Я беру константу".

Ответы [ 2 ]

4 голосов
/ 30 октября 2011

Временное значение не является постоянным:

C();  // not const

Если вы хотите обращаться к нему постоянно, разыграйте его:

f(static_cast<const C&>(C()));

Дело в том, что объект, функция-член которого (здесь оператор преобразования) вызывается, не является константой. Это не имеет ничего общего с результатом преобразования.

Результат не обязательно должен быть постоянным. Предположим, мы добавили еще один класс:

class D { };

class C {
  // ...
  operator D() { return D(); }
};

int main()
{
  D d;
  static_cast<D>(C()) = d;      // OK: assign d to the result of the conversion
  // static_cast<int>(C()) = 6; // Error: left-hand side is not an lvalue
}
1 голос
/ 30 октября 2011

Это может вас удивить, но это совершенно законно C ++:

class C { } ;
int main()
  {
  C d ;
  C() = d ;
  }

См. эту ссылку идеально для доказательства. Так что C() это lvalue.

...