此输出有效还是编译器错误?

时间:2013-06-28 22:40:17

标签: c++ c++11 initializer-list

#include <iostream>
#include <string>

int main(int argc, char *argv[])
{
    std::string s = {123};
    std::cout << s << std::endl;
}

为什么此程序打印{作为输出?它是否只是打印前面的{

的底层词法分析器中的错误

我用g ++ 4.8.1编译了这个(没有错误或警告)。 MSVC不编译此抱怨string不是聚合类型。

1 个答案:

答案 0 :(得分:7)

您正在列表初始化一个包含字符数组的字符串。 123ASCII code of {。没有编译器错误。

您正在调用的构造函数是std::string的initalizer-list构造函数(参见here以供参考),如C ++ 11标准的第21.4.2 / 15段所述:< / p>

basic_string(std::initializer_list<CharT> init, 
             const Allocator& alloc = Allocator());
     

效果:与basic_string(il.begin(), il.end(), a)相同。

MSVC不支持列表初始化,这就是为什么您收到的消息抱怨string不是聚合这一事实。