在模板函数中调用std::for_each时出现错误结果

wrong result when std::for_each is called in a template function

本文关键字:each 结果 错误 for 函数 调用 std      更新时间:2023-10-16

测试代码:

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;
}

注意,我在不同的lambda中使用int itypename T::value_type v参数类型
编译cmd: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"?

编辑:这可能是一个叮当声++错误
@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

这是一个Clang错误,由r160614修复。Clang trunk提供所需的输出:

$ 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。