Для простого случая gcc выдаёт практически идентичный код.
#include <boost/range/irange.hpp>
void do_the_thing(int);
void oldschool(int a, int b)
{
for (auto i = a; i < b; ++i)
do_the_thing(i);
}
void ranges(int a, int b)
{
for (auto i : boost::irange(a, b))
do_the_thing(i);
}
Перечитал статью внимательнее. Судя по симптомам и лечению, действительно (был) единственный.
ISO IEC 14882-2003 §12.8 Copying class objects [class.copy]
A member function template is never instantiated to perform the copy of a class object to an object of its class type.
Сноска:
106) Because a template constructor is never a copy constructor, the presence of such a template does not suppress the implicit declaration of a copy constructor. Template constructors participate in overload resolution with other constructors, including copy constructors, and a template constructor may be used to copy an object if it provides a better match than other constructors.
ISO IEC 14882-2011 §12.8 Copying class objects [class.copy]
A member function template is never instantiated to produce such a constructor signature.
Т.е. шаблонный конструктор не считается за конструктор копирования как бы вы его не шаблонили, поэтому компилятор сделал свой и использует его когда он лучше подходит, чем шаблонный.
Т.е. нужно явно определять конструктор копирования, что вы в итоге и сделали, но это не «some magic cases», а так и задумано.
However, it is ultimately the decision of the library developer which versions of C++ to support and how.
New libraries will not be rejected because they lack support for older platforms, particularly if new language or library features are integral to the library interface or design. An example would be a library that cannot provide a usable interface without use of a new C++ feature.
Тогда уж лучше increaseSpeed(double speed_meters_per_sec), ато ещё спросят как вы в миллисекундах скорость измеряете.
А вообще идея статьи взята из выступления Страуструпа на GoingNative2012 (но примеры и реализация как-то неудачно обрезаны), лучше посмотреть, если ещё не.
Он(майнкрафт) как чистый лист бумаги: если тебе есть что сказать — ты пишешь, если же нет, то сам по себе этот лист бумаги тебя не развеселит, в этом наверное и заключается главный минус данной игры.
Проблема парсинга C++ не столько в том, что его парсить долго, сколько в том, что его парсить много:
Там, где другие распарсили бы 2 строчки, компилятор C++ парсит почти 0.6 Мб.
Насчет сложных случаев не уверен, можно ли сочинить такой, что gcc решит это всё не инлайнить.
ISO IEC 14882-2003 §12.8 Copying class objects [class.copy]
Сноска:
ISO IEC 14882-2011 §12.8 Copying class objects [class.copy]
Т.е. шаблонный конструктор не считается за конструктор копирования как бы вы его не шаблонили, поэтому компилятор сделал свой и использует его когда он лучше подходит, чем шаблонный.
Т.е. нужно явно определять конструктор копирования, что вы в итоге и сделали, но это не «some magic cases», а так и задумано.
А copy-elision тут ни в чём не виновен.
Это единственный конструктор, предназначеный для копирования DReference?
svn.boost.org/trac/boost/wiki/BoostEvo
GCC 4.6.3
GCC 4.7.2
www.coursera.org/course/algo2
www.coursera.org/course/algs4partI
www.coursera.org/course/algs4partII
see.stanford.edu/see/lecturelist.aspx?coll=2d712634-2bf1-4b55-9a3a-ca9d470755ee
www.coursera.org/course/hardware
?
Также можно взглянуть на Boost.TypeErasure, который недавно приняли в состав.
Ещё на эту тему есть тут: http://www.youtube.com/watch?v=_BpMYeUFXv8.
%home%вместо$HOMEили~вас не смущает?Linux 32bit, gcc 4.6.3, Qt 4.8.1
А вообще идея статьи взята из выступления Страуструпа на GoingNative2012 (но примеры и реализация как-то неудачно обрезаны), лучше посмотреть, если ещё не.