Здравствуйте, Аноним, Вы писали:
А>Т.е. оператор auto отметает квалификатор const.
А>Буду признателен, если кто-то укажет, где почитать о такой особенности (если это не бага, конечно).
Не баг. Почитать в стандарте C++0x.
Если нужна константная ссылка, то пиши auto const& х = ...
Сделано так, т.к. добавить const или ссылку можно, а вот убрать — нет.
А>Начал активно пользоваться 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";
Здравствуйте, Xeor, Вы писали:
R>>Сделано так, т.к. добавить const или ссылку можно, а вот убрать — нет.
X>Так ведь автор и говорит о том, что VS спокойно убрал.
Так ведь я и говорю о том, что он и должен убирать. А если он нужен, то можно добавить руками.
S>Все нормально: "auto r_a1 = r_a;" интерпретируется как "ClassA r_a1 = r_a;", и это логично (ты не написал что хочешь ссылку — получи копию). Если хочешь константную ссылку — "const auto &r_a1 = r_a";
Точно, логично.
Недоглядел, что тип ra_1 не ссылка, а объект класса. Спасибо.
S>Все нормально: "auto r_a1 = r_a;" интерпретируется как "ClassA r_a1 = r_a;", и это логично (ты не написал что хочешь ссылку — получи копию). Если хочешь константную ссылку — "const auto &r_a1 = r_a";
Кстати, как оказалось достаточно просто auto& и r_a1 становится const ClassA&.