2012-05-26 2 views
2

나는 Clang이 말한 것을 이해할 수 없거나 G ++처럼 올바르게 작동하는지 여부를 알 수 없다. 4.7이 제대로 컴파일하는 것처럼 보인다.Clang ++ 비 정적 데이터 멤버 초기화 오류? C++ 11

비 정적 멤버에 중괄호를 사용하여 std::uniform_int_distribution을 초기화하려고하면 오류가 발생합니다.

error: chosen constructor is explicit in copy-initialization 
    std::uniform_int_distribution<Int> random_dist{0, b-1}; 
               ^~~~~~~~ 

/usr/include/c++/v1/algorithm:2644:14: note: constructor declared here 
    explicit uniform_int_distribution(result_type __a = 0, 

나는, 그러나, 이렇게하여 초기화 할 수 있습니다 :

std::uniform_int_distribution<Int> random_dist = std::uniform_int_distribution<Int>(0, token_count - 1);

을 오류가있는 std::uniform_int_distribution<Int> random_dist{0, token_count-1};

:

다음은 실패 (token_count 템플릿 매개 변수입니다)

다음 명령을 사용하여 컴파일하고 있습니다 : clang++ -std=c++11 -stdlib=libc++ -lc++abi wit h Clang-3.2. clang -v

출력 : 당신은 아마 아직 일반화 초기화를 구현하지 않는 그 소리의 버전이

clang version 3.2 (trunk 157320) 
Target: x86_64-unknown-linux-gnu 
Thread model: posix 
+1

당신이 우리에게'그 소리의 -v'에서 정확한 출력을 줄 수는? – Xeo

+0

아마 old-school'std :: uniform_int_distribution random_dist (0, token_count-1)'을 사용할 수 있습니다. – kennytm

+0

이 [버그] (http://llvm.org/bugs/show_bug.cgi?id=12120) *가 해당 될 수 있지만 확실하지 않습니다. –

답변

1

. Tip-of-trunk clang은 코드를 컴파일합니다. 당신은이 기능을 확인할 수 있습니다 :

#if __has_feature(cxx_generalized_initializers) 

여기를 확인할 수있는 기능의 목록입니다 :

http://clang.llvm.org/docs/LanguageExtensions.html#cxx11

+1

글쎄, 그는 그가 Clang 3.1을 사용하고 있었기 때문에 일반화 된 이니셜 라이저를 지원하지 않는 것이 이상하다고 생각하는 Clang 3.2를 사용했다고 말합니다. 그러나 나는 Clang 3.2 r156775가 코드를 확실히 컴파일한다는 것을 확인할 수있다. – Xeo

+2

나는 그것이 최근의 버그 수정이었다고 확신한다. –

+0

아마도 우리는 다음을 필요로 할 것입니다 : __has_feature (cxx_nonstatic_member_init) –

관련 문제