неверный результат, когда std:: for each вызывается в функции шаблона
Тестовый код:
template<typename T>
void test() {
T container { 1, 2, 3 };
std::for_each(container.begin(), container.end(), [](int v) {
cout<<"1st for_each"<<endl;
});
cout<<"xxxxxx"<<endl;
std::for_each(container.begin(), container.end(), [](typename T::value_type v) {
cout<<"2nd for_each"<<endl;
});
}
int main() {
test<vector<int>>();
return 0;
}
Обратите внимание, что я использую типы int i
и typename T::value_type v
param в разных лямбдах.скомпилировать cmd:
clang++ -std=c++11 -stdlib=libc++ test.cpp -o test
Clang версия 3.1 (ветви / release_31) Цель: i386-pc-linux-gnu Модель потока: posix
Результат:
2nd for_each
2nd for_each
2nd for_each
xxxxxx
2nd for_each
2nd for_each
2nd for_each
Проблема в следующем: почему сначала for_each
выведите "2nd for_each"?
Edit: это может быть ошибка clang++.
@KennyTM дал аналогичный более простой код:
#include <iostream>
using namespace std;
template<typename T>
void test() {
([](int v) { printf("1n"); })(3);
([](T v) { printf("2n"); })(4);
}
int main() {
test<int>();
return 0;
}
Результат:
1
1
1 ответ:
Это был лязг ошибка, и была зафиксирована r160614. Лязг ствола дает желаемый результат:
Дополнительную информацию смотрите в разделах PR12917 и PR13849.$ echo ' #include <cstdio> template<typename T> void test() { ([](int) { puts("int"); })(0); ([](double) { puts("double"); })(0); ([](T) { puts("T"); })(0); } int main() { test<int>(); test<double>(); } ' | ./build/bin/clang -x c++ -std=c++11 - $ ./a.out int double T int double T