【发布时间】:2015-04-01 20:10:30
【问题描述】:
我尝试对成员使用值初始化,对构造函数使用值初始化(我不知道我是否真的用好术语...)
所以...当我定义:
struct A
{
int a_;
};
我可以使用:
A a{5};
assert(m.a_==5);
但是,如果我想使用成员大括号初始化器和初始化列表构造器
struct B
{
int b_ {1};
};
这不能编译(c++14:http://ideone.com/MQ1FMU):
B b{2};
这是错误:
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&&'
在概念方面有什么区别? 非常感谢!
【问题讨论】:
-
嗯,我认为这是因为
B不是一个聚合,但据我所知,它实际上似乎满足要求。这简直是不平凡的。 -
请注意,Ideone.com 上的“C++14”是 g++-4.9.2,它不符合 C++14(正如此编译错误所证明的那样!)
标签: c++ c++11 initialization c++14