是这样的初始化列表合法的C ++ 11?(Is initializer list like this

2019-07-19 16:31发布

我读了C ++底漆第5版,它说,最新的标准支持列表初始化。

我的测试代码是这样的:

#include <iostream>
#include <string>
#include <cctype>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
using std::ispunct;
int main(int argc, char *argv[])
{
    vector<int> a1 = {0,1,2};
    vector<int> a2{0,1,2}; // should be equal to a1
    return 0;
}

然后我用锵4.0:

bash-3.2$ c++ --version
Apple clang version 4.0 (tags/Apple/clang-421.0.60) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin12.2.0
Thread model: posix

并编译如下:

c++ -std=c++11 -Wall    playground.cc   -o playground

然而,抱怨是这样的:

playground.cc:13:17: error: no matching constructor for initialization of
      'vector<int>'
    vector<int> a1 = {0,1,2};
                ^    ~~~~~~~

 /usr/include/c++/4.2.1/bits/stl_vector.h:255:9: note: candidate constructor
  [with _InputIterator = int] not viable: no known conversion from 'int'
  to 'const allocator_type' (aka 'const std::allocator<int>') for 3rd
  argument;
    vector(_InputIterator __first, _InputIterator __last,
    ^
/usr/include/c++/4.2.1/bits/stl_vector.h:213:7: note: candidate constructor
  not viable: no known conversion from 'int' to 'const allocator_type'
  (aka 'const std::allocator<int>') for 3rd argument;
  vector(size_type __n, const value_type& __value = value_type(),

我查了锵的C ++支持状态 ,它看起来它应该已经支持初始化列表中锵3.1。 但为什么我的代码不能正常工作。 有没有人有这个想法?

Answer 1:

该代码是合法的,问题是你的编译器+ stdlib的设置。

苹果的Xcode附带GNU C古老4.2.1版本++标准库的libstdc ++(见https://stackoverflow.com/a/14150421/981959了解详细信息)和该版本的日期提前下用很多年,所以++ 11它std::vector不具有初始化列表构造。

要使用C ++ 11层的功能,你要么需要安装和使用较新的libstdc ++,或者告诉铛使用苹果自己的libc ++库,你用做-stdlib=libc++选项。



文章来源: Is initializer list like this legal in C++11?