2012-05-26 72 views
2

我似乎无法弄清楚Clang在说什么或者它是否正确,因为G ++ - 4.7似乎很好地编译它。Clang ++非静态数据成员初始化错误? C++ 11

错误来自于尝试使用花括号为非静态成员初始化std::uniform_int_distribution

下失败(token_count是一个模板参数): std::uniform_int_distribution<Int> random_dist{0, token_count-1};

与错误:

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

我使用下面的命令来编译它:clang++ -std=c++11 -stdlib=libc++ -lc++abi机智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

也许你可以使用旧式'std :: uniform_int_distribution random_dist(0,token_count-1)'。 – kennytm

+0

这个[bug](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.2,因为那些已经在Clang 3.1中工作了,所以我觉得有点奇怪,不支持泛化初始化。但是,我可以确认Clang 3.2 r156775肯定会编译代码。 – Xeo

+2

我很确定这是一个最近的错误修复。 –

+0

也许我们还需要:__has_feature(cxx_nonstatic_member_init) –