缺少编译器警告,大括号初始值设定项不正确

lack of compiler warning with incorrect brace initializer

本文关键字:不正确 编译器 警告      更新时间:2023-10-16

更新2:

正如所怀疑的那样,这与具有初始值设定项列表构造函数无关。根据R.Martinho Fernandes的评论,很明显,它只是试图用一个在使用大括号语法时未检测到的自身副本来构造一个对象:

struct C{
   C(){}   
};
struct D{
   C c0{c0};  // << -- compiles without warning
   C c1(c1);  // << -- does not compile
};

问题仍然存在。对于这种情况,标准是否要求进行诊断?我确实意识到,对于各种错误,诊断是不可能的,也不实用。

我最终报告了这个错误,为57758。

原始问题:

我很熟悉的人设法编写了错误的代码(由纯粹的打字错误引起),最终生成了虚假的bad_alloc异常。我想知道是否有充分的理由gcc(4.7.2和4.8.1)没有对此发出警告。

对于这种情况,标准是否要求进行诊断?我确实意识到,对于各种错误,诊断是不可能的,也不实用。

这就是

#include <initializer_list>
struct A{};
struct C{
   C(std::initializer_list<A*> as){}   
};
struct D{
   C c{c}; // <<- well...
};    
int main(){
   D d;
}

编辑:我提到initializer_list的原因是,如果我删除初始化器列表构造函数,我会得到一个错误:error: too many initializers for ‘C’

我认为这是由于没有用户定义的(用户声明的?)构造函数,我得到了聚合初始化,但由于C中没有成员(类型为C),所以聚合初始化不起作用。

Clang++也有相同的行为。当c0的值未初始化时,您将其传递到默认的复制构造函数,而不会收到"在此处使用时未初始化"警告。(编写一个私有副本构造函数进行确认。)

我认为正在发生的是direct-list-initialization。我不知道标准是否需要诊断,但值得提交一份错误报告。