ReadingLab / Discussion-for-Cpp

C++ 中文讨论区
MIT License
89 stars 63 forks source link

C++ primer第五版9.2.5节疑问 #75

Closed EnzoFerrari430 closed 7 years ago

EnzoFerrari430 commented 7 years ago

书上说的不允许用花括号包围的值列表进行赋值,为什么我输入书上这个例子,发现是可以通过的。这个是什么情况? 我是win7 32位系统+codeblock16.01 编译器是GNU GCC Compiler 勾选了-std=C++11

pezy commented 7 years ago

什么例子,可否写出来?

EnzoFerrari430 commented 7 years ago
#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 7 years ago

@EnzoFerrari430

嗯嗯,你看的真仔细。关于 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 7 years ago

OK,感谢解答