[c++] conversion constructor

bigbill

допустим, что есть
  class A
{
public:
int a;
A(int x): a(x){}
}
и функция
void show(A& a)
{
////
}
когда я пытаюсь вызвать show(10) то получаю сообщение об ошибке, разве conversion constructor не должен автоматически конвертировать 10 в объект класса А?

margadon

class A
{
public:
int a;
A(int x): a(x){}
}
и функция
void show(A& a)
{
////
}
const A&

bigbill

можно подробнее?

margadon

void show(const A& a)
{
////
}

bigbill

не совсем понятно требования конст для аргумента функции

istran

В C++ запрещено создавать неконстантные ссылки на временные объекты. Если бы это было разрешено, то появились бы неоднозначности вроде:

double d = 1.0;
double& dr = d; // тут dr ссылка на d
dr = 2.0; // поменяли d
assert(d == 2.0);
int i = 1;
double& ir = i; // тут ir ссылка на временный объект.
ir = 2; // поменяли временный объект
assert(i == 1);

Как видишь при одинаковом синтаксисе, семантика сильно отличается. Чтобы избежать этого, разрешили делать только константные ссылки на временные объекты.

bigbill

можешь проверить мой ход рассуждений?
допустим я show(4), но 4 это временный объект и 4 мы не можем передать ссылке на обьект класса, а только константой ссылке?

Dimon89

да

Maurog

Как видишь при одинаковом синтаксисе, семантика сильно отличается
неочевидности никогда не пугали стандартописателей
у тебя есть ссылочки полезные, где разжевали бы причину запрета создавать неконст ссылки на временные объекты? лично я не вижу каких-то технических (привет Visual Studio) или концептуальных проблем
пример как нынче разрешено иметь неконст ссылки на временные объекты

int main()
{
int i = 0;
double&& d = i;
d = 1.0;
return 0;
}

http://ideone.com/QmQ6tF

istran

4 - это не объект класса A, а int. Единственный способ передать в твою функцию 4, это создать временный объект класса A. Так вот, этот объект нельзя вешать на неконтстантную ссылку.
Можно сделать так:

A a(4);
Show(a);

Вообще твой код дурно пахнет. Во-первых, нехорошо делать не explicit конструкторы от одного аргумента. Во-вторых, зачем методу Show нужна неконстантная ссылка на A? Он изменяет состояние аргумента?

istran

int i = 0;
double&& d = i;
Зато ты не можешь сделать так:

double d = 1.0;
double&& dr = d;

получишь ошибку "rvalue reference to type 'double' cannot bind to lvalue of type 'double'".
у тебя есть ссылочки полезные, где разжевали бы причину запрета создавать неконст ссылки на временные объекты? лично я не вижу каких-то технических (привет Visual Studio) или концептуальных проблем
Нет.
Я тоже не вижу технических ограничений.
Оставить комментарий
Имя или ник:
Комментарий: