聚合初始化,当初始化值小于成员数量时,谁具有成员初始值设定项

问题描述 投票:0回答:0

根据文件,其中指出[强调我的]:

初始值设定项列表中缺少初始值设定项

如果初始化了聚合但初始化值的数量 少于成员数,则所有剩余成员为 使用空的初始值设定项列表进行初始化。在大多数情况下,这会 对这些成员执行值初始化。 我们已经在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
c++ aggregate
© www.soinside.com 2019 - 2024. All rights reserved.