Извините, но разве это трюки/советы? Ладно, с макросами — трюк, но vector::reserve, swap — это ведь и не трюки, и не советы. И статья на статью не тянет.
Извините ещё раз.
а если я хочу, чтобы swap действительно был выбран из std? Вы ответите — тогда просто пишем std::swap(a, b). А теперь в коде появляется и swap и :=:. И swap более заметен, чем :=:(это как с советом «определяйте функция преобразования operator T() только в крайних случаях»).
Согласитесь, что не нужно делать изменения в языке, чтобы избежать одной только, понятной всем, маленькой строчки кода using std::swap;. Это излишне. В С++ и так слишком много штук, которые можно сделать в слишком много способов, не нужно добавлять избыточности.
Visual Studio я не признавал, так как он был громоздким, и создавал кучу каких-то файликов
О боже, точь-в-точь такие же ассоциации вызывал тогда простой и понятный Dev-C++ и огромная и непонятная Visual Studio.
Почему-то очень трогательные воспоминания. Спасибо!
жесть, ну не нужен «специальный оператор обмена» :=:. И так разобраться во всём, что добавили трудно, учитывая, что сколько не работай с С++03 — «каждый день что-то новое узнаёшь».
Вы, наверное, меня не поняли. Я имел в виду, что если уж говорить о проблеме, то зачем наводить нереальные примеры? В том плане, что std::vector и т. д. — вполне стандартизированные вещи.
template <typename T, typename A = std::allocator<T>, typename _P1 = def1, typename _P2 = def2, ...>
class vector;
Вы абсолютно правы. Конечно, предложенный способ не подойдёт.
Ну не знаю, я бы привёл реализацию operator new (msvc10):
_C_LIB_DECL
int __cdecl _callnewh(size_t size) _THROW1(_STD bad_alloc);
_END_C_LIB_DECL
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{ // try to allocate size bytes
void *p;
while ((p = malloc(size)) == 0)
if (_callnewh(size) == 0)
{ // report no memory
static const std::bad_alloc nomem;
_RAISE(nomem);
}
return (p);
}
становится ясно, что operator new просто выделяет память, причём тем-же malloc — при неудачном выделении памяти — вызывает new_handler функцию и только потом (если ничего не изменилось) бросает исключение.
имеенно об этом я и говорю — ничего о T* constGoogle C++ Style Guide не говорит.
И я ничего не говорил о передаче изменяемого параметра как const T* — имелось в виду, что Google C++ Style Guide если уж и что-то говорит о передаче параметров — то только о const T*, а не о T* const (или const T* const).
Меня просто не поняли, глупо получилось.
В Google C++ Style Guide идёт речь об const T*, тогда как в статье говорится о том, что Google C++ Style Guide рекомендует «константный указатель *const», т.е. T* const, что не одно и тоже. Смысл говорить об одном и давать ссылку на немножко другое? Ладно, не столь важно, статья не об этом.
new T
иnew T()
?vector::reserve
,swap
— это ведь и не трюки, и не советы. И статья на статью не тянет.Извините ещё раз.
Напомнило:
InvalidateRect(hwnd, NULL, FALSE)
swap
действительно был выбран изstd
? Вы ответите — тогда просто пишемstd::swap(a, b)
. А теперь в коде появляется иswap
и:=:
. Иswap
более заметен, чем:=:
(это как с советом «определяйте функция преобразованияoperator T()
только в крайних случаях»).Согласитесь, что не нужно делать изменения в языке, чтобы избежать одной только, понятной всем, маленькой строчки кода
using std::swap;
. Это излишне. В С++ и так слишком много штук, которые можно сделать в слишком много способов, не нужно добавлять избыточности.О боже, точь-в-точь такие же ассоциации вызывал тогда простой и понятный Dev-C++ и огромная и непонятная Visual Studio.
Почему-то очень трогательные воспоминания. Спасибо!
std::vector
и т. д. — вполне стандартизированные вещи.Вы абсолютно правы. Конечно, предложенный способ не подойдёт.
Можно и упростить (хотя, вряд ли это упрощение..):
Зачем заглядывать — все
std
контейнеры используютstd::allocator
.Вот и мне так показалось. А судя по коду, мне также кажеться, делалось это в спешке.
SDK
-то не дляWindows
, а то я на радостях очень огорчился, увидевMakefile
:operator new
(msvc10
):становится ясно, что
operator new
просто выделяет память, причём тем-жеmalloc
— при неудачном выделении памяти — вызываетnew_handler
функцию и только потом (если ничего не изменилось) бросает исключение.first(std::get<Indices>(first_args)...)
?А статья интересная — спасибо за перевод.
Хотел спросить — что насчёт
и COM ? Как там с этим обстоят дела, кто знает?
T* const
Google C++ Style Guide не говорит.И я ничего не говорил о передаче изменяемого параметра как
const T*
— имелось в виду, что Google C++ Style Guide если уж и что-то говорит о передаче параметров — то только оconst T*
, а не оT* const
(илиconst T* const
).Меня просто не поняли, глупо получилось.
const T*
, тогда как в статье говорится о том, что Google C++ Style Guide рекомендует «константный указатель *const», т.е.T* const
, что не одно и тоже. Смысл говорить об одном и давать ссылку на немножко другое? Ладно, не столь важно, статья не об этом.