テストコード:
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
パラメータ型を使用していることに注意してください。
コマンドをコンパイルします。clang++ -std=c++11 -stdlib=libc++ test.cpp -o test
clang バージョン 3.1 (branches/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