【发布时间】:2015-04-25 00:02:12
【问题描述】:
可以定义一个struct (a) 没有用户定义的构造函数,并且 (b) 不能为其生成默认构造函数。比如下面的Foo:
struct Baz
{
Baz(int) {}
};
struct Foo
{
int bar;
Baz baz;
};
您仍然可以使用聚合初始化创建Foo 的实例:
Foo foo = { 0, Baz(0) };
我的普通编译器 (VS2012) 会勉强接受这一点,但它会引发 2 个警告:
警告 C4510:“Foo”:无法生成默认构造函数。
警告 C4610:struct 'Foo' 永远无法实例化 - 需要用户定义的构造函数
当然,我刚刚证明警告 #2 是错误的——您仍然可以使用聚合初始化来实例化它。我尝试过的在线编译器很乐意接受上述内容,所以我猜 VS2012 只是对这个警告过于激进了。但我想确定一下——这段代码是否正常,或者它在技术上是否违反了标准中一些晦涩的部分?
【问题讨论】:
-
这当然是一个完美的 cromulent 聚合,可以按照 C++11 的描述进行实例化。要么是旧方言中存在一些晦涩难懂的东西(我对此表示怀疑,但无法证实,我的语言历史学家甚至不如语言律师),或者编译器的警告过于严厉。
-
只是为了摆脱警告,您是否尝试过删除默认构造函数以便编译器不会尝试不可能的事情?
-
这不是一个没有构造函数的结构。它有一个隐式声明的复制构造函数。
-
@DaleWilson VS2012 不支持删除语法,但如果我确信代码没问题,我可以使用 pragma 禁用警告。
-
@T.C.这是真的(见我的编辑)。我想到的构造函数类型有一个简洁的术语吗?
标签: c++ visual-studio-2012 language-lawyer default-constructor aggregate-initialization