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}; }
用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...
但是,compiling with g++ 4.8.1 through ideone gives errors:
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}; ^
如果我删除Foo(const Foo&)= delete;那么它在compiles fine在g 4.8.1.
解决方法
An aggregate is an array or a class (Clause 9) with no user-provided constructors (12.1),no brace-or-equal-initializers for non-static data members (9.2),no private or protected non-static data members (Clause 11),no base classes (Clause 10),and no virtual functions (10.3).
用户提供的是在8.4.2 [dcl.fct.def.default] p4中定义的:
… A special member function is user-provided if it is user-declared and not explicitly
defaulted or deleted on its first declaration.
Foo有两个用户声明的构造函数,它们都在其第一个声明中被明确地默认或删除,所以Foo是一个聚合.
海湾合作委员会错了.
原文地址:https://www.jb51.cc/c/110744.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。