VS 2010 реализация auto
От: Аноним  
Дата: 05.07.10 13:40
Оценка:
Доброго всем дня.

Начал активно пользоваться C++0x расширениями в VS 2010, и обнаружил неприятность при объявлении
переменных с помощью операторы вывода типа auto.

class ClassA
{
public:
void fn() {} // НЕ const метод
};

void funca()
{
ClassA a;
const ClassA& r_a = a; // ссылка на константный объект

auto r_a1 = r_a; // по идее, должна быть ссылка на константный объект...
r_a1.fn(); // ...ан нет, спокойно компилируется и выполняется

ClassA& r_a2 = r_a; // здесь все хорошо — ругается
r_a2.fn();

}

Т.е. оператор auto отметает квалификатор const.

Буду признателен, если кто-то укажет, где почитать о такой особенности (если это не бага, конечно).
Спасибо.
auto const vs 2010 c++0x
Re: VS 2010 реализация auto
От: remark Россия http://www.1024cores.net/
Дата: 05.07.10 13:45
Оценка: 20 (1) +1
Здравствуйте, Аноним, Вы писали:

А>Т.е. оператор auto отметает квалификатор const.


А>Буду признателен, если кто-то укажет, где почитать о такой особенности (если это не бага, конечно).


Не баг. Почитать в стандарте C++0x.
Если нужна константная ссылка, то пиши auto const& х = ...
Сделано так, т.к. добавить const или ссылку можно, а вот убрать — нет.


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: VS 2010 реализация auto
От: Xeor Россия  
Дата: 05.07.10 14:00
Оценка: :)
Здравствуйте, remark, Вы писали:

R>Сделано так, т.к. добавить const или ссылку можно, а вот убрать — нет.


Так ведь автор и говорит о том, что VS спокойно убрал.
Re: VS 2010 реализация auto
От: _nn_  
Дата: 05.07.10 14:24
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Доброго всем дня.


http://www.comeaucomputing.com/tryitout/ тоже компилит с auto.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: VS 2010 реализация auto
От: _nn_  
Дата: 05.07.10 14:29
Оценка:
Здравствуйте, Аноним, Вы писали:

Как насчет такого сценария:

class ClassA
{
public:
void fn() {}
};

void funca()
{
ClassA a;
const ClassA& r_a = a;

auto r_a1 = r_a;
r_a1.fn();

decltype(r_a) r_a2 = r_a;
r_a2.fn(); // Здесь падает, а в остальных нет

decltype(r_a1) r_a3 = r_a;
r_a3.fn();
}

int main(){}


А если посмотреть внимательней на типы:
a    - ClassA
r_a  - ClassA const&
r_a1 - ClassA
r_a2 - ClassA  const&
r_a3 - ClassA


Теперь, думаю понятно почему компилируется и не компилируется.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: VS 2010 реализация auto
От: sraider http://dvinogradov.blogspot.com
Дата: 05.07.10 14:34
Оценка: 1 (1)
А>Начал активно пользоваться C++0x расширениями в VS 2010, и обнаружил неприятность при объявлении
А>переменных с помощью операторы вывода типа auto.

А>class ClassA

А>{
А>public:
А> void fn() {} // НЕ const метод
А>};

А>void funca()

А>{
А> ClassA a;
А> const ClassA& r_a = a; // ссылка на константный объект

А> auto r_a1 = r_a; // по идее, должна быть ссылка на константный объект...

А> r_a1.fn(); // ...ан нет, спокойно компилируется и выполняется

А> ClassA& r_a2 = r_a; // здесь все хорошо — ругается

А> r_a2.fn();

А>}


А>Т.е. оператор auto отметает квалификатор const.


А>Буду признателен, если кто-то укажет, где почитать о такой особенности (если это не бага, конечно).

А>Спасибо.

Все нормально: "auto r_a1 = r_a;" интерпретируется как "ClassA r_a1 = r_a;", и это логично (ты не написал что хочешь ссылку — получи копию). Если хочешь константную ссылку — "const auto &r_a1 = r_a";
Re[3]: VS 2010 реализация auto
От: remark Россия http://www.1024cores.net/
Дата: 05.07.10 15:44
Оценка:
Здравствуйте, Xeor, Вы писали:

R>>Сделано так, т.к. добавить const или ссылку можно, а вот убрать — нет.


X>Так ведь автор и говорит о том, что VS спокойно убрал.


Так ведь я и говорю о том, что он и должен убирать. А если он нужен, то можно добавить руками.


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: VS 2010 реализация auto
От: uaf  
Дата: 05.07.10 20:57
Оценка:
S>Все нормально: "auto r_a1 = r_a;" интерпретируется как "ClassA r_a1 = r_a;", и это логично (ты не написал что хочешь ссылку — получи копию). Если хочешь константную ссылку — "const auto &r_a1 = r_a";

Точно, логично.
Недоглядел, что тип ra_1 не ссылка, а объект класса. Спасибо.

P.S. зато с указателями все без нюансов.
Re[2]: VS 2010 реализация auto
От: uaf  
Дата: 06.07.10 06:50
Оценка:
S>Все нормально: "auto r_a1 = r_a;" интерпретируется как "ClassA r_a1 = r_a;", и это логично (ты не написал что хочешь ссылку — получи копию). Если хочешь константную ссылку — "const auto &r_a1 = r_a";

Кстати, как оказалось достаточно просто auto& и r_a1 становится const ClassA&.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.