fp1*_*p12 6 c++ initialization c++11 c++14
我尝试对构造函数的值初始化的成员使用值初始化(我不知道我是否真的使用了良好的术语......)
所以......当我定义:
struct A
{
int a_;
};
Run Code Online (Sandbox Code Playgroud)
我可以使用:
A a{5};
assert(m.a_==5);
Run Code Online (Sandbox Code Playgroud)
但是,如果我想使用member brace initializer和一个初始化列表构造函数
struct B
{
int b_ {1};
};
Run Code Online (Sandbox Code Playgroud)
这不编译(c ++ 14:http://ideone.com/MQ1FMU):
B b{2};
Run Code Online (Sandbox Code Playgroud)
这是错误:
prog.cpp:19:7: error: no matching function for call to 'B::B(<brace-enclosed initializer list>)'
B b{2};
^
prog.cpp:19:7: note: candidates are:
prog.cpp:10:8: note: constexpr B::B()
struct B
^
prog.cpp:10:8: note: candidate expects 0 arguments, 1 provided
prog.cpp:10:8: note: constexpr B::B(const B&)
prog.cpp:10:8: note: no known conversion for argument 1 from 'int' to 'const B&'
prog.cpp:10:8: note: constexpr B::B(B&&)
prog.cpp:10:8: note: no known conversion for argument 1 from 'int' to 'B&&'
Run Code Online (Sandbox Code Playgroud)
概念方面有什么区别?非常感谢!
根据 C++11 规则,B
不是聚合类型。C++11 [dcl.init.aggr]/1:
聚合是一个数组或类(第 9 条),没有用户提供的构造函数 (12.1),没有非静态数据成员的大括号或等于初始化器( 9.2 ),没有私有或受保护的非静态数据成员 (第 11 条),没有基类(第 10 条),也没有虚函数(10.3)。
B
仅具有默认构造函数,因此无法从braced-initializer-list {2}
进行初始化。
C++14 允许对聚合中的非静态数据成员使用大括号或等于初始化程序。N4140 [dcl.init.aggr]/1:
聚合是一个数组或类(第 9 条),没有用户提供的构造函数(12.1),没有私有或受保护的非静态数据成员(第 11 条),没有基类(第 10 条),也没有虚函数(10.3 ))。
具有相当直接的语义:没有指定初始化程序的字段从它们的大括号或等于初始化程序(如果有)初始化,否则使用{}
[dcl.init.aggr]/7 初始化:
如果列表中的初始化子句少于聚合中的成员,则每个未显式初始化的成员应从其大括号或等于初始化器初始化,或者,如果没有大括号或等于初始化器,来自空的初始值设定项列表 (8.5.4)。
因此,您的程序是有效的 C++14 ( DEMO )。本质上,C++11 中禁止大括号或等于初始化器是 C++14 纠正的一个错误。
归档时间: |
|
查看次数: |
158 次 |
最近记录: |