Clang中的初始化列表

use*_*292 13 c++ c++11

今天Apple更新了Xcode的命令行工具,然后将clang从318.0.58升级到318.0.61.

我试过使用初始化列表,但无法编译下面的代码.

#include <iostream>
#include <random>
#include <initializer_list>

int main()
{
    std::mt19937 rng(time(NULL));

    std::initializer_list<double> probabilities =
    {
        0.5, 0.1, 0.1, 0.1, 0.1, 0.1
    };

    std::discrete_distribution<> cheat_dice (probabilities);

    int a[6] = { };

    for ( int i = 0 ; i != 1000; ++i )
    {
        ++a[cheat_dice(rng)];
    }

    for ( int i = 0; i != 6; ++i )
    {
        std::cout << i + 1 << "=" << a[i] << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我试着编译.

$ clang++ -stdlib=libc++ foo.cpp
Run Code Online (Sandbox Code Playgroud)

错误日志

foo.cpp:9:10: error: no member named 'initializer_list' in namespace 'std'
    std::initializer_list<double> probabilities =
    ~~~~~^
foo.cpp:9:33: error: expected '(' for function-style cast or type construction
    std::initializer_list<double> probabilities =
                          ~~~~~~^
foo.cpp:9:35: error: use of undeclared identifier 'probabilities'
    std::initializer_list<double> probabilities =
                                  ^
foo.cpp:10:5: error: expected expression
    {
    ^
foo.cpp:14:46: error: use of undeclared identifier 'probabilities'
    std::discrete_distribution<> cheat_dice (probabilities);
                                             ^
5 errors generated.
Run Code Online (Sandbox Code Playgroud)

另一方面,我可以用gcc-4.7.1-RC-20120606编译上面的代码.

$ g++ -std=c++11 foo.cpp
Run Code Online (Sandbox Code Playgroud)

Apple的clang不支持初始化列表吗?铿锵版:

$ clang++ -v
Apple clang version 3.1 (tags/Apple/clang-318.0.61) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin11.4.0
Thread model: posix
Run Code Online (Sandbox Code Playgroud)

dir*_*tly 13

尝试指定-std=c++0x(如@jweyrich正确指出)作为clang命令行的一部分.默认为clangC++ 98模式.初始化列表是C++ 11的一项功能.

此外,从clang C++ 98和C++ 11 支持页面,您可以检查各种新的C++标准功能的状态.例如,初始化列表在3.1(及更高版本)中可用.

  • @ user1214292:如当前答案中所述,Apple提供的Clang版本(3.0)不支持初始化列表. (3认同)

All*_*lan 7

使用命令编译:

clang++ -stdlib=libc++ -std=c++0x foo.cpp
Run Code Online (Sandbox Code Playgroud)

请注意,-std=c++11也有效.在我的机器上,运行:

$ clang --version
Run Code Online (Sandbox Code Playgroud)

结果是:

Apple clang version 4.1 (tags/Apple/clang-421.11.66) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin12.2.0
Run Code Online (Sandbox Code Playgroud)