假设我有这样的事情:
class A
{
public:
A(int x, int y)
{
std::cout << "Constructed from parameters" << std::endl;
}
// Non-copyable, non-movable
A(A const&) = delete;
A(A&&) = delete;
A& operator=(A const&) = delete;
A& operator=(A&&) = delete;
};
class B
{
public:
B() = default;
private:
A a{1,2};
};
int main()
{
B b;
return 0;
}
a
这工作正常,通过调用构造函数使用默认值进行初始化A
,然后打印Constructed from parameters
.
然后,假设我想以a
不同的方式初始化,所以我添加了一个构造函数,它接受一个初始化列表并更改我的代码:
class A
{
public:
A(int x, int y)
{
std::cout << "Constructed from parameters" << std::endl;
}
A(std::initializer_list<int> someList)
{
std::cout << "Constructed from an initializer list" << std::endl;
}
// Non-copyable, non-movable
A(A const&) = delete;
A(A&&) = delete;
A& operator=(A const&) = delete;
A& operator=(A&&) = delete;
};
class B
{
public:
B() = default;
private:
A a{1,2,3};
};
int main()
{
B b;
return 0;
}
一切仍然按我的意愿工作,代码a
通过调用A
的第二个构造函数使用默认值初始化并打印Constructed from an initializer list
。
现在,假设我想保持原样,但通过第一个构造函数A
返回设置的默认值。a
如果A
是可移动的,我可以使用A a = A(1,2);
,但这里不是这种情况,那么我该怎么做呢?使用该构造函数设置默认值是不可能的吗?
编辑:我正在寻找适用于 C++14 的解决方案,但如果在 C++17 或 C++20 中有更好的解决方案,那也是我想知道的。