неверный результат при вызове 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 типы параметров в разных лямбдах.
Скомпилируйте 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»?

Изменить: Это может ошибка Clang ++.
@KennyTM дал похожий более простой код:

#include <iostream>
using namespace std;

template<typename T>
void test() {
([](int v) { printf("1\n"); })(3);
([](T v) { printf("2\n"); })(4);
}

int main() {
test<int>();
return 0;
}

результат:
1
1

24

Решение

Это была ошибка Clang, и она была исправлена r160614. Ствол Clang дает желаемый результат:

$ 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

Увидеть PR12917 а также PR13849 для дополнительной информации.

12

Другие решения

Других решений пока нет …