考虑:
struct Person
{
int height;
int weight;
int age;
};
int main()
{
Person p { .age = 18 };
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在C99中是合法的,但在C++ 11中不合法.
什么是C++ 11标准委员会排除了这样一个方便的功能支持的理由?
当我运行此代码时:
struct X {
int a;
};
struct Y : public X {};
X x = {0};
Y Y = {0};
Run Code Online (Sandbox Code Playgroud)
我明白了:
error: could not convert ‘{0}’ from ‘<brace-enclosed initializer list>’ to ‘Y’
Run Code Online (Sandbox Code Playgroud)
为什么大括号初始化适用于基类而不适用于派生类?
我有一些结构,它们都具有一些通用功能,我已将它们放入模板化基类中(此处Foo<int>)
template<int I>
struct Foo
{
void foo() { std::cout << "foo: " << I << '\n'; }
};
struct Bar : Foo<1>
{
int i;
int j;
};
Run Code Online (Sandbox Code Playgroud)
现在,当我初始化它们中的任何一个时,我必须这样做:
Bar b{{}, 1, 2};
Run Code Online (Sandbox Code Playgroud)
我希望能够这样做:
Bar b{1, 2};
Run Code Online (Sandbox Code Playgroud)
而且也无需编写构造函数的样板。这个问题有解决办法吗?
类似的问题在这里被问到,但是,这是 7 年前的事了,所以我想知道从那时起是否有任何进展。另外,该问题被标记为与此处的
问题重复,但是这个问题略有不同,因为基本结构不为空。
此外,除了以更具声明性的方式向某些结构添加功能之外,我并没有真正尝试完成任何其他事情,而不是重复每个结构中所有常用方法的定义。因此,任何通过规避继承(理想情况下宏除外;D)来实现这一点的解决方案都可以工作。