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

leg*_*s2k 0 c++ initializer-list c++11

#include <iostream>
#include <string>

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

为什么这个程序打印{为输出?它只是打印前面的词法分析器中的错误{吗?

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

And*_*owl 7

您是列表初始化一个包含字符数组的字符串.123ASCII码{.没有编译器错误.

您正在调用的构造函数是initalizer-list构造函数std::string(参见此处参考),如C++ 11标准的第21.4.2/15节所述:

basic_string(std::initializer_list<CharT> init, 
             const Allocator& alloc = Allocator());
Run Code Online (Sandbox Code Playgroud)

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

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