如何强制编译器使用聚合初始化而不是构造函数

How do I force compiler to use aggregate init instead of constructor

考虑以下示例:

#include <iostream>

struct Test
{
    int a, b;

    Test(int, int)
    {
        a = b = 0;
    }
};

int main() {
    Test v {1, 1};
    std::cout << v.a << ' ' << v.b << '\n';
    return 0;
}

此处 {1, 1} 调用 Test(int, int) 构造函数,因此输出为 0 0 .

是否可以强制编译器聚合初始化 v 以便输出为 1 1

此时我使用单独的方法直接初始化文件,如:

struct Test
{
    ...
    static Test NewTest(int x, int y)
    {
        Test ret;
        ret.a = x;
        ret.b = y;
        return ret;
    }
}

但我想知道是否有更好的方法来做到这一点。

Is it possible to force compiler to aggregate initialize v so that output would be 1 1?

一种方法是完全删除构造函数。

struct Test
{
    int a, b;
};

聚合初始化要求类型为聚合。拥有用户声明的构造函数会使类型成为非聚合类型,因此这是不可能的。如果您删除构造函数,那么您的类型将变成聚合,并且聚合初始化将发生。