【发布时间】:2014-11-29 09:12:50
【问题描述】:
正在尝试用大括号括起来的初始化程序列表,编译器的行为似乎有所不同(嗯,这是一个相当新的功能),但想知道正确的行为应该是什么,特别是如果下面提到的“c3”实际上应该使用私有编译,默认初始化变量?
int main() {
struct c1 {
bool b;
char c;
int i;
};
auto c1_ = c1{true, '0', 0};
//clang-3.6 - okay
//gcc-4.9 - okay
//vs-2013 - okay
// ------------------------------------------
struct c2 {
bool b;
char c;
int i = 0; // with default value
};
auto c2_ = c2{true, '0', 0};
//clang-3.6 - okay
//gcc-4.9 - error: no matching function for call to ‘c2::c2(<brace-enclosed initializer list>)’
//vs-2013 - error C2440: '<function-style-cast>' : cannot convert from 'initializer-list' to 'c2'
auto c2__ = c2{true, '0'};
//clang-3.6 - okay
//gcc-4.9 - error: no matching function for call to ‘c2::c2(<brace-enclosed initializer list>)’
//vs-2013 - error C2440: '<function-style-cast>' : cannot convert from 'initializer-list' to 'c2'
// ------------------------------------------
struct c3 {
bool b;
char c;
private:
int i = 0; // with private default value
};
auto c3_ = c3{true, '0'};
//clang-3.6 - error: no matching constructor for initialization of 'c3'
//gcc-4.9 - error: no matching function for call to ‘c3::c3(<brace-enclosed initializer list>)’
//vs-2013 - error C2440: '<function-style-cast>' : cannot convert from 'initializer-list' to 'c3'
}
【问题讨论】:
标签: c++ visual-c++ gcc c++11 clang