24

テストコード:

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

4

1 に答える 1

12

これは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を参照してください。

于 2012-09-14T20:06:15.000 に答える