Но rvalue может неявно привестись только к константному lvalue (iterator const&), либо к временному (iterator&&).
Хочу добавить уточнение: для пользовательских типов сделано послабление. От их временных объектов в выражениях могут браться lvalue-ссылки. Я не помню, где это в стандарте указано, но понимаю для чего это сделано. Дело в том, что у временных объектов пользовательского типа можно вызывать неконстантные методы. А вызов метода с неявным this-аргументом равносильно вызову внешней функции с этим объектом в качестве аргумента.
Я могу и ошибаться. Позже поищу в стандарте, сейчас некогда.
Теперь я понял, почему у меня компилируется, а у автора статьи нет. В студии vector<T>::iterator это класс, а в компиляторе автора скорее всего T*.
Нет-нет, в этом примере возвращается именно vector<int>::iterator, это можно проверить в отладчике. nickolaym действительно правильно объяснил (за одним исключением, добавлю ему коммент), проблема в том, что begin возвращает временный объект, от которого хотят lvalue reference.
Насчет константности я все понимаю, здесь константность я имел в виду в контексте iterator/const_iterator.
Насчет листинга 4.3 я не понял:
MyVector v;
v.push_back(1);
processIterator(v.begin());
Почему у Вас v.begin() возвращает константный итератор? У меня вызывается неконстантная версия begin(), как и должно было быть, ведь v не константный.
В VS 2008 и 2012 отлично компилируется.
Дело в том, что отдельное определение статических членов вне класса:
const int SwitchClass::ONE = 1;
const int SwitchClass::TWO = 2;
может находиться в отдельной единице трансляции (т.е. cpp-файле), а компилятор для case должен подставить интегральную константу, известную на этапе компиляции в текущей единице трансляции.
class SwitchClass
{
public:
static const int ONE = 1; // являются интегральными константами времени компиляции по стандарту
static const int TWO = 2;
....
};
Кстати, есть совсем старые компиляторы, которые такой синтаксис не поддерживают.
Это происходит из-за того, что имена производного класса по-умолчанию скрывают имена базового, поэтому скрытые имена не участвуют в перегрузке.
using явно вносит имена в область видимости производного класса, что делает их полноценными кандидатами на разрешение перегрузки.
Под windows же поднять буст и парвильно настроить — нетривиальная задача
Да ну, вы что. Для bind и остальной большей части буста, вообще ничего настраивать не нужно, только заинклудить bost/bind.hpp, это же header-only библиотеки.
Что касается link-библиотек, под винду настраивается тривиально. Если не желаете сами собирать, то скачиваете готовые, собранные либы с www.boostpro.com/download/ Там даже msi-установщик готовый.
Мультиметоды и в статически-типизированных языках реализуемы:
1. Для C++ Страуструп предложил драфт о вводе в язык мультиметодов. Вот еще.
2. Я сам разработал шаблонную библиотеку мультиметодов для С++.
2. С# 4.0 нативно поддерживает. Правда, я не знаю, как там это устроено.
Так что мультиметоды не прерогатива динамически-типизированных языков.
Возможно, я ошибаюсь, но мне казалось, что стандарт не накладывает ограничение на количество параметров шаблона по-умолчанию, например в std::vector:
template <typename T, typename A = std::allocator<T>, typename _P1 = def1, typename _P2 = def2, ...>
class vector;
— вполне может быть валидной сигнатурой vector.
Тогда, предложенный Вами способ не подойдет, т.к. заранее не известно, сколько параметров у шаблона.
Поправьте меня, если я ошибаюсь.
Я бы рекомендовал Вам напрямую с ними пообщаться (зарегайтесь на форуме). Я чисто случайно заметил пост и решил перебросить его на хабр, т.к. у меня есть аккаунт здесь.
Спасибо, я имел ввиду вот этот доклад video.mail.ru/video/mail/rccnt-bl/1295#video=/mail/rccnt-bl/1295/1311 27.06.2013 на семинаре в РУДН Ю.Н. Бажутов прочитал доклад о результатах экспериментов с плазменным электролизом. Примерно 14 мин. очень похожие параметры как на хабре. Тот же стакан воды… немного соли… напряжение…
Очень похожая установка, был существенный выход нейтронов. Ребята проводя эксперемент могли бы получить дозу.
На довольно серьезном топике «Холодный термояд заработал?» форума cnews человек пишет:
«Пересеклись Вода горит! А также ЭГЭ и волны-убийцы habrahabr.ru/post/187084/ и Бажутов Ю.Н. Интересно, а ребята счетчики нейтронов ставили? (я бы задал этот вопрос, но комментарии, только от тех, кто имеет инвайт-приглашение).»
Я тоже с трудом смог представить «кристалл соли», как Вы его назвали.
А представить сложно вот почему: на оригинальном изображении в изометрии каждая пара параллельных плоскостей подкрашена отдельным цветом — читай воображаемый источник света одинаково подсвечивает параллельные поверхности. Поэтому, не напрягаясь, мозг распознает то большой куб с маленьким выпиленным, то маленький куб в углу. На это и рассчитана светотень.
Я поменял местами эти же цвета, и представить «кристалл соли с дефектом» стало значительно проще (по крайней мере мне):
Хочу добавить уточнение: для пользовательских типов сделано послабление. От их временных объектов в выражениях могут браться lvalue-ссылки. Я не помню, где это в стандарте указано, но понимаю для чего это сделано. Дело в том, что у временных объектов пользовательского типа можно вызывать неконстантные методы. А вызов метода с неявным this-аргументом равносильно вызову внешней функции с этим объектом в качестве аргумента.
Я могу и ошибаться. Позже поищу в стандарте, сейчас некогда.
Теперь я понял, почему у меня компилируется, а у автора статьи нет. В студии
vector<T>::iterator
это класс, а в компиляторе автора скорее всего T*.Нет-нет, в этом примере возвращается именно
vector<int>::iterator
, это можно проверить в отладчике. nickolaym действительно правильно объяснил (за одним исключением, добавлю ему коммент), проблема в том, что begin возвращает временный объект, от которого хотят lvalue reference.Насчет константности я все понимаю, здесь константность я имел в виду в контексте iterator/const_iterator.
MyVector v;
v.push_back(1);
processIterator(v.begin());
Почему у Вас v.begin() возвращает константный итератор? У меня вызывается неконстантная версия begin(), как и должно было быть, ведь v не константный.
В VS 2008 и 2012 отлично компилируется.
может находиться в отдельной единице трансляции (т.е. cpp-файле), а компилятор для case должен подставить интегральную константу, известную на этапе компиляции в текущей единице трансляции.
Кстати, есть совсем старые компиляторы, которые такой синтаксис не поддерживают.
using явно вносит имена в область видимости производного класса, что делает их полноценными кандидатами на разрешение перегрузки.
Проблема решается просто:
Не обязательно решать проблему через enum, Можно так:
Да ну, вы что. Для bind и остальной большей части буста, вообще ничего настраивать не нужно, только заинклудить bost/bind.hpp, это же header-only библиотеки.
Что касается link-библиотек, под винду настраивается тривиально. Если не желаете сами собирать, то скачиваете готовые, собранные либы с www.boostpro.com/download/ Там даже msi-установщик готовый.
1. Для C++ Страуструп предложил драфт о вводе в язык мультиметодов. Вот еще.
2. Я сам разработал шаблонную библиотеку мультиметодов для С++.
2. С# 4.0 нативно поддерживает. Правда, я не знаю, как там это устроено.
Так что мультиметоды не прерогатива динамически-типизированных языков.
— вполне может быть валидной сигнатурой vector.
Тогда, предложенный Вами способ не подойдет, т.к. заранее не известно, сколько параметров у шаблона.
Поправьте меня, если я ошибаюсь.
«Пересеклись Вода горит! А также ЭГЭ и волны-убийцы habrahabr.ru/post/187084/ и Бажутов Ю.Н. Интересно, а ребята счетчики нейтронов ставили? (я бы задал этот вопрос, но комментарии, только от тех, кто имеет инвайт-приглашение).»
Разъясните, пожалуйста ребятам, что они просят.
А представить сложно вот почему: на оригинальном изображении в изометрии каждая пара параллельных плоскостей подкрашена отдельным цветом — читай воображаемый источник света одинаково подсвечивает параллельные поверхности. Поэтому, не напрягаясь, мозг распознает то большой куб с маленьким выпиленным, то маленький куб в углу. На это и рассчитана светотень.
Я поменял местами эти же цвета, и представить «кристалл соли с дефектом» стало значительно проще (по крайней мере мне):