请有最新C++编译器的大神帮忙验证,C++ Primer 5的列表初始化

彭家老三 2013-10-28 08:24:20
最近一个活动是读这本书的试读章节,我看到下面这两句代码的时候有点迷惑,我手中也没有最新的编译器验证,请大家帮忙看看。
3.3 标准库类型 vector 第92页:
vector<string> v7{10}; // v7 有10 个默认初始化的元素
vector<string> v8{10, "hi"}; // v8 有10 个值为"hi"的元素

不知道是不是我理解得有问题,总觉得根据上下文的意思,这里应该用圆括号才对。
...全文
184 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ri_aje 2013-10-28
  • 打赏
  • 举报
回复
primer 是正确的,这两句

vector<string> v7{10}; // v7 有10 个默认初始化的元素
vector<string> v8{10, "hi"};
与下面两句是一样的

vector<string> v7(10); // v7 有10 个默认初始化的元素
vector<string> v8(10, "hi");
#5 提出的问题只有在 vector<int> 的时候才存在,对 vector<string> 不存在。
  • 打赏
  • 举报
回复
引用 5 楼 stereoMatching 的回复:
[quote=引用 3 楼 wangdahu888 的回复:] 我在gcc 4.7试了,可以的,不必纠结,看如下说明: C c {0,0}; //C++11 only. 相当于: C c(0,0); 比如你定义了一个类: Class A{ public: int a; A(int i){a=i;} }; 调用: A a{3};这时a.a就等于3
你这样当然可以,你再多加个 A(std::initializer_list<int> A); 看看编译器会调用那个? 我在2楼也有提到这点 现在大家都流行回帖前不看帖了?

#include <initializer_list>
#include <iosteram>


class A{
public:
int a;
A(int) { std::cout<<"int constructor"<<std::endl;}
A(int, int) { std::cout<<"int, int constructor"<<std::endl; }
A(std::initializer_list<int>)
{ 
std::cout<<"initializer list"<<std::endl;
}
};

int main()
{
  A a1{0};
  A a2{0, 0};
  A a3(0);
  A a4(0, 0);
}
uniform initialization http://en.wikipedia.org/wiki/C++11#Uniform_initialization[/quote] +10086
stereoMatching 2013-10-28
  • 打赏
  • 举报
回复
引用 3 楼 wangdahu888 的回复:
我在gcc 4.7试了,可以的,不必纠结,看如下说明: C c {0,0}; //C++11 only. 相当于: C c(0,0); 比如你定义了一个类: Class A{ public: int a; A(int i){a=i;} }; 调用: A a{3};这时a.a就等于3
你这样当然可以,你再多加个 A(std::initializer_list<int> A); 看看编译器会调用那个? 我在2楼也有提到这点 现在大家都流行回帖前不看帖了?

#include <initializer_list>
#include <iosteram>


class A{
public:
int a;
A(int) { std::cout<<"int constructor"<<std::endl;}
A(int, int) { std::cout<<"int, int constructor"<<std::endl; }
A(std::initializer_list<int>)
{ 
std::cout<<"initializer list"<<std::endl;
}
};

int main()
{
  A a1{0};
  A a2{0, 0};
  A a3(0);
  A a4(0, 0);
}
uniform initialization http://en.wikipedia.org/wiki/C++11#Uniform_initialization
qq120848369 2013-10-28
  • 打赏
  • 举报
回复
vector (initializer_list<value_type> il, const allocator_type& alloc = allocator_type()); 这是新特性.
  • 打赏
  • 举报
回复
我在gcc 4.7试了,可以的,不必纠结,看如下说明: C c {0,0}; //C++11 only. 相当于: C c(0,0); 比如你定义了一个类: Class A{ public: int a; A(int i){a=i;} }; 调用: A a{3};这时a.a就等于3
stereoMatching 2013-10-28
  • 打赏
  • 举报
回复
这里应该使用传统的(),因为vector有提供initializer_list的constructor 所以你使用{}的时候会优先选择有initializer_list的constructor
漫步者、 2013-10-28
  • 打赏
  • 举报
回复
看标准,C++98:

default (1)	
explicit vector (const allocator_type& alloc = allocator_type());
fill (2)	
explicit vector (size_type n, const value_type& val = value_type(),
                 const allocator_type& alloc = allocator_type());
range (3)	
template <class InputIterator>
         vector (InputIterator first, InputIterator last,
                 const allocator_type& alloc = allocator_type());
copy (4)	
vector (const vector& x);

C++11:
default (1)	
explicit vector (const allocator_type& alloc = allocator_type());
fill (2)	
explicit vector (size_type n);
         vector (size_type n, const value_type& val,
                 const allocator_type& alloc = allocator_type());
range (3)	
template <class InputIterator>
  vector (InputIterator first, InputIterator last,
          const allocator_type& alloc = allocator_type());
copy (4)	
vector (const vector& x);
vector (const vector& x, const allocator_type& alloc);
move (5)	
vector (vector&& x);
vector (vector&& x, const allocator_type& alloc);
initializer list (6)	
vector (initializer_list<value_type> il,
       const allocator_type& alloc = allocator_type());
所以是小括号
stereoMatching 2013-10-28
  • 打赏
  • 举报
回复
引用 7 楼 ri_aje 的回复:
primer 是正确的,这两句

vector<string> v7{10}; // v7 有10 个默认初始化的元素
vector<string> v8{10, "hi"};
与下面两句是一样的

vector<string> v7(10); // v7 有10 个默认初始化的元素
vector<string> v8(10, "hi");
#5 提出的问题只有在 vector<int> 的时候才存在,对 vector<string> 不存在。
你是正确的,我刚才才去翻阅了一下primer 5 理由是使用uniform initalization的时候 如果提供的parameter无法match到initializer_list的要求 会转而呼叫其他适合的constructor vector<string> a{10}; //same as a(10) std::initializer_list<std::string>自然无法接受 10 这个parameter 所以会呼叫c++98就定义好的constructor vector<int> a{10}; int的情况是因为initializer_list<int>可以接受 10 这个parameter 因为优先权的关系,所以initializer_list<int>会先被呼叫

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧