为什么这段代码在Clang ++中有效但不在G ++中?

Cor*_*lks 10 c++ g++ c++11 clang++

请考虑以下代码:

struct Foo
{
    int x, y;

    Foo() = default;
    Foo(const Foo&) = delete;
    Foo& operator=(const Foo&) = delete;
};

int main()
{
    Foo f1 {1, 2};
    Foo f2 = {1, 2};
}
Run Code Online (Sandbox Code Playgroud)

使用clang ++进行编译不会产生任何错误:

$ clang++ --version
Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
Target: x86_64-apple-darwin12.4.0
Thread model: posix
$ clang++ -std=c++11 -stdlib=libc++ -pedantic t.cpp -o out
...builds and runs fine...
Run Code Online (Sandbox Code Playgroud)

但是,通过ideone使用g ++ 4.8.1进行编译会产生错误:

prog.cpp: In function ‘int main()’:
prog.cpp:12:17: error: no matching function for call to ‘Foo::Foo(<brace-enclosed initializer list>)’
     Foo f1 {1, 2};
                 ^
prog.cpp:12:17: note: candidate is:
prog.cpp:5:5: note: Foo::Foo()
     Foo() = default;
     ^
prog.cpp:5:5: note:   candidate expects 0 arguments, 2 provided
prog.cpp:13:19: error: could not convert ‘{1, 2}’ from ‘<brace-enclosed initializer list>’ to ‘Foo’
     Foo f2 = {1, 2};
                   ^
Run Code Online (Sandbox Code Playgroud)

如果我删除Foo(const Foo&) = delete;然后它在g ++ 4.8.1 编译好.

我的代码中是否有错误,一个编译器忽略但另一个不是?

Cas*_*sey 15

C++ 11 8.5.1 [dcl.init.aggr] p1定义聚合类型:

骨料是没有用户提供的构造的阵列或一个类(第9节)(12.1),无支架或-相等初始化用于非静态数据成员(9.2),没有私有或保护非静态数据成员(第11条),没有基类(第10条),没有虚函数(10.3).

用户提供的内容在8.4.2 [dcl.fct.def.default] p4中定义:

...如果特殊成员函数是用户声明的,并且未在其第一个声明中明确默认或删除,则由用户提供.

Foo有两个用户声明的构造函数,它们都在第一个声明中显式默认或删除,因此Foo是聚合.

GCC错了.

编辑:这实际上是GCC错误52707.