根据文件,其中指出[强调我的]:
初始值设定项列表中缺少初始值设定项
如果初始化了聚合但初始化值的数量 少于成员数,则所有剩余成员为 使用空的初始值设定项列表进行初始化。在大多数情况下,这会 对这些成员执行值初始化。 我们已经在here讨论了如何正确理解这句话。
但是,当类有默认初始化器时,上述语句就不合适了。 这是下面的示例代码。
#include <iostream>
#include <type_traits>
struct Employee_no_default_member_initializer
{
int id;
int age;
double wage;
};
struct Employee_with_default_member_initializer
{
int id {1};
int age {20};
double wage {5.0};
};
template<typename T>
class is_allowed_type:public std::false_type{};
template<>
class is_allowed_type<Employee_with_default_member_initializer>:public std::true_type{};
template<>
class is_allowed_type<Employee_no_default_member_initializer>:public std::true_type{};
template<typename T, typename std::enable_if<is_allowed_type<T>::value, void>::type* = nullptr>
std::ostream& operator<<(std::ostream&os, const T& employee)
{
os << "id="<< employee.id << std::endl;
os << "age="<< employee.age << std::endl;
os << "wage="<< employee.wage << std::endl;
return os;
}
template<typename T, typename std::enable_if<is_allowed_type<T>::value,void>::type* = nullptr>
void foo()
{
T frank = { 3 }; // copy-list initialization using braced list
T joe { 2, 28}; // list initialization using braced list (preferred)
std::cout << frank << std::endl;
std::cout << joe << std::endl;
}
int main()
{
std::cout << "#1" << std::endl;
foo<Employee_with_default_member_initializer>();
std::cout << "#2" << std::endl;
foo<Employee_no_default_member_initializer>();
return 0;
}
这是输出:
#1
id=3
age=20
wage=5
id=2
age=28
wage=5
#2
id=3
age=0
wage=0
id=2
age=28
wage=0