C++ primer第五版9.2.5节疑问
EnzoFerrari430 opened this issue · 4 comments
EnzoFerrari430 commented
书上说的不允许用花括号包围的值列表进行赋值,为什么我输入书上这个例子,发现是可以通过的。这个是什么情况?
我是win7 32位系统+codeblock16.01 编译器是GNU GCC Compiler 勾选了-std=C++11
pezy commented
什么例子,可否写出来?
EnzoFerrari430 commented
#include <iostream>
#include <vector>
#include <array>
using namespace std;
int main()
{
array<int,10> ai1 = {0,1,2,3,4,5,6,7,8,9};
array<int,10> ai2 = {0};
ai1 = {3,3,3,3,3,3,3,3,3,3};
for(auto c: ai1)
{
cout<<c<<' ';
}
cout<<endl;
ai2 = {0}; //书上说这句不能将花括号列表赋予数组
for(auto c: ai2)
{
cout<<c<<' ';
}
cout<<endl;
return 0;
}
pezy commented
嗯嗯,你看的真仔细。关于 std::array 用花括号赋值这个特性其实在 C++ 11 标准中已经支持了(operator=)。具体发生的隐式转换可以参见 aggregate initialization 的细节描述。
那么为什么书上非要大书特书说这里不能呢?
因为 C++ Primer 5 已经出版 5 个年头了,5 年之内 C++ 的编译器发生了多大的变化?C++ 标准前进了多少?怕是一言难尽。
所以简单的回答是:那时候的 C++ 编译器无法支持,故作者想好心提示读者,怕读者失望。但却好心干了坏事,错估了编译器的长远发展。
更明智的做法应该严格遵循当时 C++ 11 标准规定来论述。
作者没有骗你的证据:
如果你在出版社主页下载过随书代码,会发现其给出的 GCC 实现是基于 gcc 4.7 的。请见 gcc 4.7 的编译结果:
http://coliru.stacked-crooked.com/a/7beb86779c502c53
作者诚不欺也。
EnzoFerrari430 commented
OK,感谢解答