В С++ 03 следующий код работает нормально:
int main()
{
std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
std::vector<int> v2;
v2.push_back(2);
v2.push_back(3);
v2.push_back(4);
std::transform(v.begin(), v.end(), v2.begin(), v2.begin(), std::max<int>);
return 0;
}
В С++ 11 это не работает, потому что добавлена перегрузка для std::max
, которая содержит initializer_list
. Поэтому вам нужно использовать очень уродливый бросок, чтобы выбрать правильную перегрузку:
static_cast<const int& (*)(const int&, const int&)>(std::max)
У меня есть несколько вопросов.
- Почему стандартный комитет решил сделать это, зная, что это (возможно) нарушит существующий код и заставит пользователя создать уродливый листинг?
- Являются ли будущие стандарты С++ попытками облегчить эту проблему?
- Что такое обходной путь?